在UNION之后保持ORDER BY

时间:2018-03-07 22:19:06

标签: mysql sql

我有一个问题需要解决。 我有一个职业姓名职业

我的任务是: 1.在“职业”中查询按字母顺序排列的所有姓名的名单,紧接着是每个职业的第一个字母作为括号(即括在括号中)。例如:AnActorName(A),ADoctorName(D),AProfessorName(P)和ASingerName(S)。

  1. 查询OCCUPATIONS中每个职业的发生次数。按升序对事件进行排序,并按以下格式输出:
  2. 共有[occup_count] [职业] s。

    如果多个职业具有相同的职业,则应按字母顺序排列。

    我差不多完成了查询

    SELECT TEMP.CON1
    FROM (
        SELECT NAME, CONCAT(NAME,'(', LEFT(OCCUPATION, 1),')') AS CON1
        FROM OCCUPATIONS
        ORDER BY NAME
        ) AS TEMP
    UNION
    SELECT TEMP2.CON2
    FROM (
        SELECT COUNT(*) AS NR, CONCAT('THERE ARE A TOTAL OF ', COUNT(OCCUPATION),' ', OCCUPATION, 's') AS CON2
        FROM OCCUPATIONS
        GROUP BY OCCUPATION
        ORDER BY NR, OCCUPATION
    ) AS TEMP2
    

    但我不知道如何在两个部分合并之后保持第一部分的顺序。

    如果有人知道答案,我会很高兴分享。

2 个答案:

答案 0 :(得分:1)

.m

答案 1 :(得分:-1)

UNION ALL会保留顺序,并且在这种情况下也可以正常工作,因为结果集完全不同。

union和union all之间的区别在于UNION删除重复项,这会导致重新排序,其中UNION ALL只是将下一组结果添加到现有结果集的末尾。由于您在两个选择上操作字符串,因此TEMP和TEMP2之间的结果中不存在重复的可能性。这也将消除查询的一些成本,因为UNIONUNION ALL更昂贵,因为它需要检查重复项。

SELECT TEMP.CON1
FROM (
    SELECT NAME, CONCAT(NAME,'(', LEFT(OCCUPATION, 1),')') AS CON1
    FROM OCCUPATIONS
    ORDER BY NAME
    ) AS TEMP
UNION ALL
SELECT TEMP2.CON2
FROM (
    SELECT COUNT(*) AS NR, CONCAT('THERE ARE A TOTAL OF ', COUNT(OCCUPATION),' ', OCCUPATION, 's') AS CON2
    FROM OCCUPATIONS
    GROUP BY OCCUPATION
    ORDER BY NR, OCCUPATION
) AS TEMP2

这就是说,我读取指令的方式,我不希望在同一结果集中需要两个结果。