有两个表-人(personName,areaId,birthDate)和区域(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
假设有区域1和区域2。2区有最老和最新出生的人。因此,应该首先出现区域2记录。
更新:我设法解决了这个问题,但是有什么方法可以缩短这个代码。
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
从表中检索细节数据,这是一个警告标志。你可能做错了什么。