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

时间:2013-01-07 16:18:56

标签: mysql select join limit

我有3个表:categoriesitemsitems_categories。这是一个多对多的关系。这个表的结构是下一个:

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
)

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

我需要一个查询,它会返回每个与最后一项相关联的所有类别,并且不再重复。由于项目可以包含多个类别,例如项目#300(最新的)在最终结果类别#1中具有类别#1和#2,而#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

我怎么做?谢谢!

1 个答案:

答案 0 :(得分:0)

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

试试这个:

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