首页 > 解决方案 > 按组限制而不省略重复项?

问题描述

我有这个有点复杂的查询(精简版):

SELECT    a.item_id,
          a.title,
          a.series,
          c.title AS manufacturer_title
FROM      catalog_items AS a
JOIN      catalog_franchises AS c ON a.manufacturer_id = c.franchise_id
JOIN      catalog_franchises AS e ON a.game_id = e.franchise_id
WHERE     e.franchise_id = 6
          AND a.valid = TRUE
          AND c.valid = TRUE
          AND e.valid = TRUE
ORDER BY  c.title, a.series, a.title

我试图关注的重要领域是c.titlea.series。因此,为简洁起见,此查询返回:

item_id      series      manufacturer_title
46           2           fantasy flight games
63           1           gaming heads
64           1           gaming heads
33           2           reaper miniatures
124          1           triforce
125          1           triforce
45           1           triforce
43           1           usaopoly

我正在尝试做的是添加LIMIT基于这些字段的唯一组合......如果我添加:GROUP BY c.title, a.series它给了我独特的组:

item_id      series      manufacturer_title
46           2           fantasy flight games
63           1           gaming heads
33           2           reaper miniatures
124          1           triforce
43           1           usaopoly

但我想要所有的行,受这些组的限制。因此,如果限制为 3,我希望前 3 组中的所有项目:

item_id      series      manufacturer_title
46           2           fantasy flight games
63           1           gaming heads
64           1           gaming heads
33           2           reaper miniatures

我希望这是有道理的。如何修改我的查询来实现这一点?

标签: mysqlsqldatabasepdo

解决方案


您可以先在子查询中选择和限制组,然后将其连接回表以获得最终结果。

SELECT DISTINCT a2.series, c2.title
FROM catalog_items AS a2
JOIN catalog_franchises AS c2 ON a2.manufacturer_id = c2.franchise_id
JOIN catalog_franchises AS e2 ON a2.game_id = e2.franchise_id
WHERE e2.franchise_id = 6
    AND a2.valid = TRUE
    AND c2.valid = TRUE
    AND e2.valid = TRUE
ORDER BY  c2.title, a2.series
LIMIT 3

只需将其添加到原始查询的 WHERE 中:

AND (a.series, c.title) IN (query above)

注意:是的,确实会导致几乎复制了自身内部的原始查询;但这通常是这些类型的查询最终需要的方式。


推荐阅读