Mysql 无法理解此SQL查询
这是Hacernak上的一个SQL的解决方案,但我不知道这个查询是如何工作的,因为我是这个领域的新手。有谁能解释一下,或者给我一个好的教程链接,在那里我可以学习这种复杂的查询Mysql 无法理解此SQL查询,mysql,sql,Mysql,Sql,这是Hacernak上的一个SQL的解决方案,但我不知道这个查询是如何工作的,因为我是这个领域的新手。有谁能解释一下,或者给我一个好的教程链接,在那里我可以学习这种复杂的查询 SET @d=0,@a=0,@p=0,@s=0; SELECT MIN(Doctor),MIN(Professor),MIN(SINGER),MIN(Actor) FROM (SELECT IF(OCCUPATION='Actor',NAME,NULL) AS Actor, IF(OCCUPATION='
SET @d=0,@a=0,@p=0,@s=0;
SELECT MIN(Doctor),MIN(Professor),MIN(SINGER),MIN(Actor)
FROM
(SELECT IF(OCCUPATION='Actor',NAME,NULL) AS Actor,
IF(OCCUPATION='Doctor',NAME,NULL) AS Doctor,
IF(OCCUPATION='Professor',NAME,NULL) AS Professor,
IF(OCCUPATION='Singer',NAME,NULL) AS SINGER,
case OCCUPATION when 'ACTOR' THEN @a:=@a+1
when 'Doctor' THEN @d:=@d+1
when 'Professor' THEN @p:=@p+1
when 'Singer' THEN @s:=@s+1
end
as idn FROM OCCUPATIONS ORDER BY NAME ) AS TMP GROUP BY TMP.idn ;
把它分成几个部分
SET @d=0,@a=0,@p=0,@s=0;
这将设置4个用户变量,并将每个变量初始化为0
SELECT IF(OCCUPATION='Actor',NAME,NULL) AS Actor,
IF(OCCUPATION='Doctor',NAME,NULL) AS Doctor,
IF(OCCUPATION='Professor',NAME,NULL) AS Professor,
IF(OCCUPATION='Singer',NAME,NULL) AS SINGER,
case OCCUPATION when 'ACTOR' THEN @a:=@a+1
when 'Doctor' THEN @d:=@d+1
when 'Professor' THEN @p:=@p+1
when 'Singer' THEN @s:=@s+1
end
as idn
FROM OCCUPATIONS
ORDER BY NAME
这将返回5列。如果该行引用特定职业,则前4列将返回该行的名称。因此,如果该行的职业是“医生”,则第2列将包含name字段的内容,而第1、3和4列将为空
第5列计算该职业的计数。这可能按照名称的顺序进行,也可能不按照名称的顺序进行(MySQL选择将值分配给未定义的用户变量)——它现在可以很好地工作,但将来可能不行。但本质上,if将包含该职业数量的顺序计数,该职业的第一个包含1,下一个包含2,以此类推
SELECT MIN(Doctor),MIN(Professor),MIN(SINGER),MIN(Actor)
FROM
(.....) AS TMP GROUP BY TMP.idn ;
这将获取前面的SELECT(用作子查询)的结果,并按计数对结果进行分组。因此,对于每个计数值(最多出现4次,每个职业一次),它将返回每个职业的MIN(按字母顺序排在第一)名称。MIN aggregate函数通常忽略空值,因此将返回第一个使用的名称
用一些虚拟数据完成这项工作。以以下内容为例:-
id Name Occupation
1 freda Actor
2 fredb Doctor
3 fredc Professor
4 fredd Actor
5 frede Doctor
6 fredf Actor
7 fredg Professor
9 fredh Singer
10 fredi Actor
11 fredj Doctor
12 fredk Professor
13 fredl Actor
14 fredm Doctor
15 fredn Professor
16 fredo Professor
17 fredp Singer
19 fredq Doctor
20 fredr Actor
子查询提供:-
Actor Doctor Professor Singer idn
freda NULL NULL NULL 1
NULL fredb NULL NULL 1
NULL NULL fredc NULL 1
fredd NULL NULL NULL 2
NULL frede NULL NULL 2
fredf NULL NULL NULL 3
NULL NULL fredg NULL 2
NULL NULL NULL fredh 1
fredi NULL NULL NULL 4
NULL fredj NULL NULL 3
NULL NULL fredk NULL 3
fredl NULL NULL NULL 5
NULL fredm NULL NULL 4
NULL NULL fredn NULL 4
NULL NULL fredo NULL 5
NULL NULL NULL fredp 2
NULL fredq NULL NULL 5
fredr NULL NULL NULL 6
外部查询对此进行操作,为每个已使用的计数提供一行(即,行数将与职业的最大数量相同,以职业数量最多的为准),并为该计数提供该职业的人员姓名:-
Doctor Professor Singer Actor
fredb fredc fredh freda
frede fredg fredp fredd
fredj fredk NULL fredf
fredm fredn NULL fredi
fredq fredo NULL fredl
NULL NULL NULL fredr
把它分成几个部分
SET @d=0,@a=0,@p=0,@s=0;
这将设置4个用户变量,并将每个变量初始化为0
SELECT IF(OCCUPATION='Actor',NAME,NULL) AS Actor,
IF(OCCUPATION='Doctor',NAME,NULL) AS Doctor,
IF(OCCUPATION='Professor',NAME,NULL) AS Professor,
IF(OCCUPATION='Singer',NAME,NULL) AS SINGER,
case OCCUPATION when 'ACTOR' THEN @a:=@a+1
when 'Doctor' THEN @d:=@d+1
when 'Professor' THEN @p:=@p+1
when 'Singer' THEN @s:=@s+1
end
as idn
FROM OCCUPATIONS
ORDER BY NAME
这将返回5列。如果该行引用特定职业,则前4列将返回该行的名称。因此,如果该行的职业是“医生”,则第2列将包含name字段的内容,而第1、3和4列将为空
第5列计算该职业的计数。这可能按照名称的顺序进行,也可能不按照名称的顺序进行(MySQL选择将值分配给未定义的用户变量)——它现在可以很好地工作,但将来可能不行。但本质上,if将包含该职业数量的顺序计数,该职业的第一个包含1,下一个包含2,以此类推
SELECT MIN(Doctor),MIN(Professor),MIN(SINGER),MIN(Actor)
FROM
(.....) AS TMP GROUP BY TMP.idn ;
这将获取前面的SELECT(用作子查询)的结果,并按计数对结果进行分组。因此,对于每个计数值(最多出现4次,每个职业一次),它将返回每个职业的MIN(按字母顺序排在第一)名称。MIN aggregate函数通常忽略空值,因此将返回第一个使用的名称
用一些虚拟数据完成这项工作。以以下内容为例:-
id Name Occupation
1 freda Actor
2 fredb Doctor
3 fredc Professor
4 fredd Actor
5 frede Doctor
6 fredf Actor
7 fredg Professor
9 fredh Singer
10 fredi Actor
11 fredj Doctor
12 fredk Professor
13 fredl Actor
14 fredm Doctor
15 fredn Professor
16 fredo Professor
17 fredp Singer
19 fredq Doctor
20 fredr Actor
子查询提供:-
Actor Doctor Professor Singer idn
freda NULL NULL NULL 1
NULL fredb NULL NULL 1
NULL NULL fredc NULL 1
fredd NULL NULL NULL 2
NULL frede NULL NULL 2
fredf NULL NULL NULL 3
NULL NULL fredg NULL 2
NULL NULL NULL fredh 1
fredi NULL NULL NULL 4
NULL fredj NULL NULL 3
NULL NULL fredk NULL 3
fredl NULL NULL NULL 5
NULL fredm NULL NULL 4
NULL NULL fredn NULL 4
NULL NULL fredo NULL 5
NULL NULL NULL fredp 2
NULL fredq NULL NULL 5
fredr NULL NULL NULL 6
外部查询对此进行操作,为每个已使用的计数提供一行(即,行数将与职业的最大数量相同,以职业数量最多的为准),并为该计数提供该职业的人员姓名:-
Doctor Professor Singer Actor
fredb fredc fredh freda
frede fredg fredp fredd
fredj fredk NULL fredf
fredm fredn NULL fredi
fredq fredo NULL fredl
NULL NULL NULL fredr
我需要帮助,而不是否定点如果你不知道,那就什么都不要做它看起来会返回演员、医生、教授和歌手的“最小”名字(其中需要定义最小的名字)。真是个奇怪的问题!!我认为它返回的职业名称最少(尚未定义),然后返回每个职业的人数(因此是案例部分)-可能是错误的!我需要帮助,而不是否定点如果你不知道,那就什么都不要做它看起来会返回演员、医生、教授和歌手的“最小”名字(其中需要定义最小的名字)。真是个奇怪的问题!!我认为它返回的职业名称最少(尚未定义),然后返回每个职业的人数(因此是案例部分)-可能是错误的!