Сначала отсортируйте результат с пустыми строками - PullRequest
1 голос
/ 11 июля 2019

У меня есть таблица locations:

+----+-----------+------------+----------+
| id |  country  |   state    |   city   |
+----+-----------+------------+----------+
|  1 |  US       | Georgia    |  Atlanta |
|  2 |  US       | California |          |
|  3 |  US       |            |          |
|  4 |  Canada   |  Ontario   |          |
|  5 |  Canada   |  Manitoba  | Winnipeg |
|  6 |  Canada   |            |          |

Я хочу создать запрос, но не могу правильно построить мой ORDER BY.Вот результат, который мне нужен:

+----+-----------+------------+----------+
| id |  country  |   state    |   city   |
+----+-----------+------------+----------+
|  6 |  Canada   |            |          |
|  3 |  US       |            |          |
|  4 |  Canada   | Ontario    |          |
|  2 |  US       | California |          |
|  5 |  Canada   | Manitoba   | Winnipeg |
|  1 |  US       | Georgia    | Atlanta  |

По сути, это приоритет, которому я хочу следовать:

  1. Список стран.В алфавитном порядке.
  2. Государственный листинг.В алфавитном порядке.
  3. Список городов.В алфавитном порядке.

Этот запрос, по-видимому, не учитывает пустые столбцы (я не использую значения NULL в моей таблице locations):

SELECT * FROM locations
ORDER BY 
    country,state,city  

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Для версий до 8.0 ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,country VARCHAR(20) NOT NULL
,state VARCHAR(20) NULL
,city VARCHAR(20) NULL
);

INSERT INTO my_table VALUES
(1,'US','Georgia','Atlanta'),
(2,'US','California',NULL),
(3,'US',NULL,NULL),
(4,'Canada','Ontario',NULL),
(5,'Canada','Manitoba','Winnipeg'),
(6,'Canada',NULL,NULL);

SELECT id
     , country
     , state
     , city 
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev=country THEN @i:=@i+1 ELSE @i:=1 END i
            , @prev:=country 
         FROM my_table x
            , (SELECT @prev:=null,@i:=0) vars 
        ORDER 
           BY country
            , city
            , state
     ) a 
 ORDER 
    BY i
     , country;
+----+---------+------------+----------+
| id | country | state      | city     |
+----+---------+------------+----------+
|  6 | Canada  | NULL       | NULL     |
|  3 | US      | NULL       | NULL     |
|  4 | Canada  | Ontario    | NULL     |
|  2 | US      | California | NULL     |
|  5 | Canada  | Manitoba   | Winnipeg |
|  1 | US      | Georgia    | Atlanta  |
+----+---------+------------+----------+
1 голос
/ 14 июля 2019
select *
from locations
order by 
  state <> '',
  city  <> '',
  country,
  state,
  city

дб-скрипка

Обратите внимание, что в MySQL логическое выражение возвращает 0 (для FALSE) или 1 (для TRUE). Это означает, что пустая строка state state <> '' вернет 0 и, таким образом, будет упорядочена первой.

1 голос
/ 11 июля 2019

Попробуйте это ORDER BY предложение:

SELECT *
FROM locations
ORDER BY
    CASE WHEN state = '' AND city = '' THEN 0
         WHEN city = '' THEN 1
         ELSE 2 END,
    country,
    state,
    city;

Эта логика сортировки помещает в первую очередь те записи, в которых отсутствуют как штат, так и город.Далее следует запись, в которой отсутствует только город, за которой следуют записи, содержащие непустые данные для всех трех полей.

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