【问题标题】:Get the last item for a many-to-many relation in MySQL获取 MySQL 中多对多关系的最后一项
【发布时间】:2012-12-21 09:52:00
【问题描述】:

我有 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
)

我有索引,但我删除了,因为此示例不需要。

我需要一个查询,它返回所有与 last item 连接的所有类别,并且不重复。由于项目可以有多个类别,假设项目#300(最新)有类别#1 和#2,最终结果类别#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

我该怎么做?谢谢!

【问题讨论】:

  • 单个查询看起来相当棘手。您不想在存储过程中或通过代码执行此操作?
  • @TJ 可能重复的东西很棘手,不是吗?至少可以轻松完成与最后一项的连接吗?通过代码会为每个类别运行一个查询吗?
  • 是的,重复的部分。是的,加入最后一个可以完成。看到这个小提琴:sqlfiddle.com/#!2/45563/3(我希望我是正确的)
  • mmm 这种子查询不会给像 1M 项目和 2.5M 关系 items_categories 这样的问题?
  • 你是对的,它会很慢。检查这个更新的查询(第二个):sqlfiddle.com/#!2/45563/26 [如果类别数量不多,它应该可以正常运行。] 尝试对这两个查询进行解释。

标签: mysql select join limit


【解决方案1】:

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

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2012-03-05
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多