Упорядочить группы строк по критериям одной строки в MySQL? - PullRequest
2 голосов
/ 04 декабря 2009

Предположим, у меня есть таблица базы данных, которая содержит информацию о городах по всей территории Соединенных Штатов. На моем дисплее отображается информация, сначала сгруппированная по штатам, затем по округам и, наконец, по городам, как показано ниже:


  • Alabama
    • Округ Аутауга
    • город 1
    • город 2
    • и т.д.
    • Болдуин Каунти
    • город 1
    • город 2
    • и т.д.
    • округ и т. Д.
  • Alaska
    • Аляска 1
    • город 1
    • Аляска 2

Запрос будет выглядеть примерно так:

select * from myInfo order by state, county, city

Новая складка заключается в том, что все штаты, в которых есть города под названием «Линкольн», должны сначала заказывать свои штаты и округа. Государства без городов с именем Линкольн должны быть заказаны после. Желаемый результат примерно такой:

  • Nebraska
    • Ланкастер Каунти
    • Lincoln
    • какой-то другой Ланкастер Сити
    • Какой-то другой округ Небраски
  • Нью-Мексико
    • Линкольн Каунти
    • Lincoln
    • какой-то другой город
    • какой-то другой округ
    1098 **
  • Состояние не Линкольна

Я мог бы сделать это сложное упорядочение в коде, но мне интересно, насколько сложно это реализовать в чистом SQL. Насколько сложен полученный запрос?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2009

Еще одна вещь, которую вы можете попробовать:

SELECT *, (city != 'Lincoln') AS test
FROM myInfo
....
ORDER BY test, state, county, city

(city != 'Lincoln') даст вам дополнительный столбец со значением 1, где название города равно Линкольн, и эти строки будут выброшены наверх в ЗАКАЗЕ.

0 голосов
/ 04 декабря 2009

Предполагая, что ваша база данных не нормализована, вот как я бы продолжил: выберите все из таблицы, добавьте самосоединение, чтобы увидеть, есть ли у пары (штат, округ) город с именем 'Линкольн' и отсортируйте его первым.

   SELECT t1.*, (t2.state IS NOT NULL) AS has_lincoln
     FROM myInfo t1
LEFT JOIN myInfo t2 ON (t2.state, t2.county, t2.city)
                     = (t1.state, t1.county, 'Lincoln')
 ORDER BY t1.state, has_lincoln DESC, t1.county, t1.city

Если по какой-либо причине в вашей базе данных есть несколько городов с именем «Линкольн» с одной и той же парой (штат, округ), добавьте DISTINCT к смеси. Или еще лучше, убедитесь, что в вашей базе данных нет повторяющихся строк, добавив ключ UNIQUE на (state, county, city)

0 голосов
/ 04 декабря 2009

... реализовать в чистом sql.

Я вижу два возможных пути.

1) добавить функцию IIF () в столбец COUNTY и упорядочить по этой функции, например, IIF (COUNTY = "Lincoln County", 1, 2) - вы используете IIF () для "переопределения" букв заказ путем замены его на «1» или «2».

2) создайте еще одну таблицу с полями (COUNTY_ID, COUNTY_NAME, SEQUENCE), которые задают конкретную последовательность, которую вы хотите. Затем вы присоединяетесь к этой таблице и добавляете SEQUENCE в предложение ORDER BY

Вариант 2 требует заранее знать все ваши округа. Но преимущество заключается в том, что вы можете добавлять более сложные правила последовательности, которые легче понимать / поддерживать, чем вложенные предложения IIF ().

...