MySQL:GROUP BY的结果到列中

eqoofvh9  于 2023-01-29  发布在  Mysql
关注(0)|答案(3)|浏览(198)

我有一个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);

然而,我不知道如何将其转换为具有两列的所需输出。

izkcnapc

izkcnapc1#

这通常是通过自连接完成的:

select D1.name, D2.name
from dogs d1
     inner join
     dogs d2
     on d1.breed=d2.breed
     and d1.age=d2.age
     and d1.name<d2.name

d1.name 〉d2.name服务于两个目的:1.防止行匹配自身,以及2.确保每对仅得到一行(例如,不是(A,G)和(G,A))。

41zrol4v

41zrol4v2#

使用GROUP_CONCAT()区分不同的名称

select 
GROUP_CONCAT(distinct name) name
from dogs
group by 
breed
,age 
having GROUP_CONCAT(name) like '%,%'

结果是
| 姓名|
| - ------|
| A、G|
| 乙、戊|
然后使用SUBSTRING_INDEXsubquery将上述结果更改为列

SELECT 
SUBSTRING_INDEX(Name, ',', 1) name1    
,SUBSTRING_INDEX(Name, ',', -1) name2   
From(
select 
GROUP_CONCAT(distinct name) Name
from dogs
group by 
breed
,age 
having GROUP_CONCAT(name) like '%,%') a

| 名称1|名称2|
| - ------|- ------|
| A类|G级|
| 乙|E级|
dbfiddle

qlzsbp2j

qlzsbp2j3#

SELECT 
 d1.name,d1.breed, d1.age, d2.name, d2.breed, d2.age
   FROM dogs  d1 
    JOIN dogs  d2
      ON d1.breed=d2.breed AND d1.age = d2.age AND d1.name != d2.name

相关问题