Проблема с ORDER BY, не сортирующая должным образом с подвыборками - PullRequest
2 голосов
/ 16 февраля 2012

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

Любая идея о том, почему функция ORDER BY не сортируется по псевдониму 'date', будет очень полезна.

Оператор SQL:

SELECT id, date, type 
    FROM (SELECT resume_id AS id, DATE_FORMAT( date_mod, '%M %e, %Y' ) AS date, 'resume' AS TYPE 
              FROM resumes 
              WHERE user_id = '$user_id' 
          UNION ALL 
          SELECT profile_id, DATE_FORMAT( date_mod, '%M %e, %Y' ) AS date, 'profile' 
              FROM profiles 
              WHERE user_id = '$user_id' 
          ORDER BY date DESC LIMIT 5) AS d1 
    ORDER BY date

Результаты:

Resume was updated on February 14, 2012
Resume was updated on February 15, 2012
Resume was updated on February 15, 2012
Resume was updated on February 9, 2012
Profile was updated on February 9, 2012

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Он сортирует их как строки, потому что вы преобразовали даты в строки, используя DATE_FORMAT (обратите внимание, что в качестве строки «15 февраля ...» меньше, чем «9 февраля ...», потому что 1 предшествует 9 валфавит").Решение заключается в сортировке по реальной дате в date_mod.Вы можете сделать это напрямую, просто добавив date_mod к выбору и изменив порядок, например:

SELECT id, date, date_mod, type
FROM (
  SELECT resume_id AS id,
    DATE_FORMAT(date_mod, '%M %e, %Y') AS date,
    date_mod,
    'resume' AS type
  FROM resumes
  WHERE user_id = '$user_id'
  UNION ALL
  SELECT profile_id AS id,
    DATE_FORMAT(date_mod, '%M %e, %Y') AS date,
    date_mod,
    'profile' AS type
  FROM profiles
  WHERE user_id = '$user_id'
  ORDER BY date_mod DESC
  LIMIT 5
) AS d1
ORDER BY date_mod

Но еще лучше упростить его, выбрав only date_mod в подзапросе (т.е. без форматированной версии) и выполнение последнего DATE_FORMAT во внешнем запросе:

SELECT id, DATE_FORMAT(date_mod, '%M %e, %Y') AS date, type
FROM (
  SELECT resume_id AS id, date_mod, 'resume' AS type
  FROM resumes
  WHERE user_id = '$user_id'
  UNION ALL
  SELECT profile_id AS id, date_mod, 'profile' AS type
  FROM profiles
  WHERE user_id = '$user_id'
  ORDER BY date_mod DESC
  LIMIT 5
) AS d1
ORDER BY date_mod
1 голос
/ 16 февраля 2012

Это порядок ваших отформатированных строк дат в виде строк, и вы хотите упорядочить их как даты. Я бы упорядочил date_mod напрямую, а затем преобразовал бы вывод в предложение SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...