【发布时间】:2018-05-09 15:35:03
【问题描述】:
我有这个有点复杂的查询(精简版):
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.title 和a.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
我希望这是有道理的。如何修改我的查询以实现此目的?
【问题讨论】:
-
什么是主键和唯一键?
-
@PaulSpiegel 以
_id结尾的每个字段都是主键/唯一键。 -
这是对
group by的滥用;它旨在用于聚合,而不是“半区别性”。 -
@Uueerdo 如果你有一个非滥用的解决方案,我愿意接受。
-
只是简单地指出,
group by的使用导致每个组的 item_id 的有效随机选择(从每个组的项目 id 值中);并且只允许在 MySQL 中使用(并且它的较新版本默认配置为禁用它)。