MYSQL按列分组,每组有2行

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)

Gor*_*off 5

如果您需要两个任意 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)