在以下情况下如何实现mysql命令

时间:2019-05-04 12:52:47

标签: mysql sql-order-by

有2个表-Person(personName,areaId,birthDate)和Area(areaId,areaCode)。现在,我要以其areaCode列出人员列表,以便将areaCode中的所有人员一起列出,并且年龄最大的areaCode应该是第一个出现的areaCode。如何通过mysql查询实现此目的?

我尝试将ORDER BY与多个列一起使用。

SELECT P.personName, A.areaCode, P.birthDate
FROM Person P
JOIN Area A ON P.areaId = A.areaId
ORDER BY P.birthDate, A.areaCode

假设有Area1和Area2。 Area2具有最老和最新出生的人。因此,Area2记录应首先出现。

更新:我设法解决了这个问题,但是有什么办法可以缩短这段代码。

SELECT * 
FROM (SELECT DISTINCT
    A.areaCode,
    MIN(P.birthDate)
FROM Area A
JOIN Person P on P.areaId = A.areaId
GROUP BY A.areaCode
ORDER BY P.birthDate) T1
JOIN (SELECT DISTINCT
    P.personName,
    A.areaCode,
    P.birthDate
FROM Area A
JOIN Person P on P.areaId = A.areaId
ORDER BY P.createdTimestamp) T2 ON T1.barcode = T2.binId;

1 个答案:

答案 0 :(得分:1)

从子查询开始,以获取每个区号的最早生日。

                       SELECT A.areaId, MIN(birthDate) earliestBirthDate
                         FROM Area A 
                         JOIN Person P ON A.areaId = p.areaId
                        GROUP BY A.areaId

您可以尝试使用此子查询说服自己,它的每个areaId精确地产生一行,并显示所需的最早生日。

然后您将子查询加入到详细查询中

SELECT P.personName, A.areaCode, P.birthDate
FROM Person P
JOIN Area A ON P.areaId = A.areaId
JOIN (
                       SELECT A.areaId, MIN(birthDate) earliestBirthDate
                         FROM Area A 
                         JOIN Person P ON A.areaId = p.areaId
                        GROUP BY A.areaId
     ) EARLY ON P.areaId = EARLY.areaID 
ORDER BY EARLY.earliestBirthDate, P.birthDate, A.areaCode

技巧是使用子查询来创建虚拟表,以便您可以从该表中的列进行排序。

专业提示:如果您发现自己使用SELECT DISTINCT从表中检索详细数据,请注意。您可能做错了什么。