Mysql 无法理解此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='

这是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='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

我需要帮助,而不是否定点如果你不知道,那就什么都不要做它看起来会返回演员、医生、教授和歌手的“最小”名字(其中需要定义最小的名字)。真是个奇怪的问题!!我认为它返回的职业名称最少(尚未定义),然后返回每个职业的人数(因此是案例部分)-可能是错误的!我需要帮助,而不是否定点如果你不知道,那就什么都不要做它看起来会返回演员、医生、教授和歌手的“最小”名字(其中需要定义最小的名字)。真是个奇怪的问题!!我认为它返回的职业名称最少(尚未定义),然后返回每个职业的人数(因此是案例部分)-可能是错误的!