mysql - 按 GROUP 限制而不省略重复项?

标签 mysql sql database pdo

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

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

我希望这是有道理的。如何修改我的查询以实现此目的?

最佳答案

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

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(上面的查询)

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

关于mysql - 按 GROUP 限制而不省略重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257135/

相关文章:

c# - 如果使用 SqlServer CE 4.0 执行代码优先,数据库的位置是什么?

android - 在分布式应用程序 [Android] 的 .apk 中嵌入数据库

mysql - 使用 MySQL 添加多个时间到多个日期

php - 将多个复选框值插入一行中的单独列

php - 在 jQuery datepicker 中更改与 MySQL 格式相同的日期格式

mysql - 试图获取名字和姓氏

sql - 必须声明标量变量

Moodle 上类(class)注册的 SQL 查询

MySQL 解释 : "Using index" vs. "Using index condition"

php - 如何在 laravel 中使用 javascript 的 post 方法将数据传递给 Controller