我有一个dogs
表,如下所示:
create table dogs (name char(10), breed, char(20), age int);
insert into dogs (name, breed, age) values ('A', 'Breed 1', 1);
insert into dogs (name, breed, age) values ('B', 'Breed 2', 2);
insert into dogs (name, breed, age) values ('C', 'Breed 3', 3);
insert into dogs (name, breed, age) values ('D', 'Breed 1', 4);
insert into dogs (name, breed, age) values ('E', 'Breed 2', 2);
insert into dogs (name, breed, age) values ('F', 'Breed 3', 5);
insert into dogs (name, breed, age) values ('G', 'Breed 1', 1);
我需要选择品种和年龄相同的狗的名称,因此输出应该如下:
name1 name2
A G
B E
因为狗A和G具有相同的品种(品种1)和年龄(1),狗B和E具有相同的品种(品种2)和年龄(2)。
我知道如何找出应该出现在输出中的狗的名称:
select name from dogs where (breed, age) in (select breed, age from (select breed, age, count(*) as n from dogs group by breed, age having n > 1) as a);
然而,我不知道如何将其转换为具有两列的所需输出。
3条答案
按热度按时间izkcnapc1#
这通常是通过自连接完成的:
d1.name 〉d2.name服务于两个目的:1.防止行匹配自身,以及2.确保每对仅得到一行(例如,不是(A,G)和(G,A))。
41zrol4v2#
使用
GROUP_CONCAT()
区分不同的名称结果是
| 姓名|
| - ------|
| A、G|
| 乙、戊|
然后使用
SUBSTRING_INDEX
和subquery
将上述结果更改为列| 名称1|名称2|
| - ------|- ------|
| A类|G级|
| 乙|E级|
dbfiddle
qlzsbp2j3#