有 2 个表 - Person(personName,areaId,birthDate)和 Area(areaId,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;
最佳答案
从子查询开始,获取每个区号中最早的出生日期。
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
从表中检索详细数据,这是一个警告标志。你可能做错了什么。
关于mysql - 以下情况如何实现mysql order by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55982708/