mysql - 以下情况如何实现mysql order by

标签 mysql sql-order-by

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

相关文章:

mysql - 根据Mysql中的两列获取最小值

mysql - 如何在MySQL中进行条件插入?

mysql - 从 SQL 迁移时在 oracle 9i 中转换

sql-server-2008 - SQL Server : How to use dense_rank on one column, 基于另一列的顺序

java - 这个打开/关闭 JDBC 连接代码可以吗?

mysql - 使用 WHERE 子查询改进 SQL

mysql - 如何在mysql中按变量排序?

sql - "Invalid column name",按子查询别名排序

mysql - 自然排序 SQL ORDER BY

MYSQL ORDER BY 字段来自列表和其他表