获取MySQL中多对多关系的最后一个项目

问题描述:

我有3个表格:categories,itemsitems_categories。这是一个多对多的关系。这个表的结构是下一个:获取MySQL中多对多关系的最后一个项目

CREATE TABLE `categories` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 
) 

CREATE TABLE `items_categories` (
    `item_id` int(10) unsigned NOT NULL, 
    `category_id` int(10) unsigned NOT NULL 
) 

CREATE TABLE `items` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `thumb` varchar(255) COLLATE utf8_unicode_ci NOT NULL 
) 

我有索引,但我删除,因为这个例子不需要。

我需要一个查询,该查询返回所有加入最后一项的类别,并且它不会重复。由于项目可以有很多类别,比如最终结果类别#1和#2中的项目#300(最新)具有类别#1和#2将与不同的项目结合。

现在我有这个疑问,但它不会做什么,我到底要:

SELECT category_id, c.name, c.slug, item_id, i.name, i.thumb 
FROM items_categories AS ic 
INNER JOIN categories AS c ON c.id = ic.category_id 
INNER JOIN (SELECT * FROM items ORDER BY id DESC) AS i ON i.id = ic.item_id 
GROUP BY c.id 
ORDER BY c.id ASC 

它返回我重复的结果,它返回的第一个项目,而不是最后一次。

虚拟数据:http://pastebin.com/D75tr4Ry

我可怎么办呢?谢谢!

+0

看起来相当棘手的单个查询。你不想在存储过程或代码中执行它? –

+0

@TJ可能重复的东西很棘手,不是吗?至少可以完成与上一个项目的连接吗?通过代码将运行每个类别的查询? – udexter

+0

是的,重复的部分。是的,加入最后可以完成。看到这个小提琴:http://sqlfiddle.com/#!2/45563/3(我希望我是正确的) –

你只是忘了在子查询中添加限制。使用限制后,您可以获取最后一个项目的所有类别。

试试这个:

SELECT category_id, c.name, c.slug, item_id, i.name, i.thumb 
FROM items_categories AS ic 
INNER JOIN categories AS c ON ic.category_id = c.id 
INNER JOIN (SELECT * FROM items ORDER BY id DESC LIMIT 1) AS i ON ic.item_id = i.id 
GROUP BY c.id 
ORDER BY c.id ASC