【问题标题】:How to implement mysql order by in following situation如何在以下情况下实现mysql命令
【发布时间】:2019-05-04 12:52:47
【问题描述】:

有 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;

【问题讨论】:

  • 请分享您的两个表数据以清除您的问题

标签: mysql sql-order-by


【解决方案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 从表中检索详细数据,这是一个警告标志。你可能做错了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2015-07-29
    相关资源
    最近更新 更多