MYSQL - сортировка 2 столбцов по алфавиту с использованием второго столбца, если первый столбец равен нулю - PullRequest
5 голосов
/ 25 января 2012

Я пытаюсь отсортировать свою базу данных mysql, ссылаясь на две колонки в алфавитном порядке, где company_name является основной сортировкой, но если нет company_name, сортируйте по last_name. Я приведу пример ниже.

company_name: (основной столбец сортировки)
1 ABC Trucking
2 Genius Heating
3
4 Xtreme Windows

фамилия: (дополнительный столбец)
1 Брайант
2 Роджерса
3 Флинта
4 Льюис

Сортирует так:
1 ABC Trucking
3 Флинта
2 Genius Heating
4 Xtreme Windows

Это вообще возможно, или мне просто объединить их в массив и отсортировать их с помощью php?

Ответы [ 2 ]

6 голосов
/ 25 января 2012

Просто сделайте выбор с колонкой в ​​качестве «имени», используя регистр и порядок по нему. Лучше всего показывает пример.

SELECT
CASE WHEN company_name IS NULL THEN last_name ELSE company_name END AS name
FROM mytable
ORDER BY name ASC

Если вы действительно этого хотите, вы также можете использовать оператор case прямо в предложении order by.
Я думаю, что вышеупомянутое - действительно лучшее решение вашей проблемы, потому что у вас больше нет логики в php, но вы можете не согласиться.

SELECT company_name, last_name
FROM mytable
ORDER BY CASE WHEN company_name IS NULL THEN last_name ELSE company_name END ASC

РЕДАКТИРОВАТЬ: Я только предположил, что company_name IS NULL правильно для вашего случая. Если вам нужно сделать это в другом состоянии, то это ваше собственное упражнение. Это ноль? или вместо этого следует сравнить с ''?

1 голос
/ 25 января 2012

Заимствование из ответа пользователя user606723, но показывающее, как это чаще всего реализуется в MySQL, который должен использовать IFNULL().

IFNULL () возвращает первое выражение, кроме случаев, когда первое выражение равно нулю, оно возвращает второе выражение. Он предназначен для таких сценариев.

SELECT
  IFNULL(company_name, last_name) AS name
FROM mytable
ORDER BY name

Редактировать

Если company_name содержит пробелы вместо NULL, то вы можете сделать это:

SELECT
  IF(company_name <> '', company_name, last_name) AS name
FROM mytable
ORDER BY name

В операторе IF, если первое выражение имеет значение true, тогда оно возвращает второе выражение, в противном случае оно возвращает третье выражение.

Если у вас может быть NULL или пусто, то это будет работать:

SELECT
  IF(company_name IS NOT NULL AND company_name <> '', company_name, last_name) AS name
FROM mytable
ORDER BY name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...