Al *_*yan 8 mysql sql group-by greatest-n-per-group
id每组需要2个.
SELECT `id`, `category`.`cat_name`
FROM `info`
LEFT JOIN `category` ON `info`.`cat_id` = `category`.`cat_id`
WHERE `category`.`cat_name` IS NOT NULL
GROUP BY `category`.`cat_name`
ORDER BY `category`.`cat_name` ASC
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
样本数据:
id cat_name
1 Cat-1
2 Cat-1
3 Cat-2
4 Cat-1
5 Cat-2
6 Cat-1
7 Cat-2
Run Code Online (Sandbox Code Playgroud)
输出将是:
id cat_name
6 Cat-1
4 Cat-1
7 Cat-2
5 Cat-2
Run Code Online (Sandbox Code Playgroud)
如果您需要两个任意 ID,请使用min()和max():
SELECT c.`cat_name` , min(id), max(id)
FROM `info` i INNER JOIN
`category` c
ON i.`cat_id` = c.`cat_id`
WHERE c.`cat_name` IS NOT NULL
GROUP BY c`.`cat_name`
ORDER BY c.`cat_name` ASC ;
Run Code Online (Sandbox Code Playgroud)
注意:您正在使用 aLEFT JOIN然后按第二个表中的列进行聚合。这通常不是一个好主意,因为非匹配项都放在一个NULL组中。此外,您的WHERE子句无论如何都会变成LEFT JOINan INNER JOIN,所以我已经解决了这个问题。该WHERE条款可能是必要的,也可能不是必要的,这取决于是否cat_name曾经是NULL。
如果您想要两个最大或最小的 - 并且可以将它们放在同一列中:
SELECT c.`cat_name`,
substring_index(group_concat id order by id), ',', 2) as ids_2
FROM `info` i INNER JOIN
`category` c
ON i.`cat_id` = c.`cat_id`
WHERE c.`cat_name` IS NOT NULL
GROUP BY c`.`cat_name`
ORDER BY c.`cat_name` ASC ;
Run Code Online (Sandbox Code Playgroud)