Как реализовать порядок MySQL в следующих ситуациях - PullRequest
2 голосов
/ 04 мая 2019

Есть 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 Ответ

1 голос
/ 04 мая 2019

Вы начинаете с подзапроса, чтобы получить самую раннюю дату рождения в каждом коде области.

                       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

Хитрость заключается в том, чтобы использовать подзапрос для создания виртуальной таблицы , чтобы вы могли заказать столбец из этой таблицы.

Pro tip : Если вы используете SELECT DISTINCT для извлечения подробных данных из таблиц, это флаг предостережения. Вы можете делать что-то не так.

...