Как я могу упорядочить свой запрос mysql по двойным критериям?

#mysql #sql

#mysql #sql

Вопрос:

У меня проблема с SQL-запросом. В одной таблице у меня есть столбцы с именами id и subid. Некоторые продукты подключаются к другим через subid в той же таблице. Пример:

 ID   | Name     |   Status    |   Subid | Location
---------------------------------------------------------
1    | Milk     |   SA        |         |  Box 1
2    | MyDay    |   SA        |   1     |
3    | Kitkat   |   SA        |   4     |
4    | Chocolate|   SA        |         |  Box 2
5    | Twix     |   SA        |   4     | 
6    | Bounty   |   SA        |   4     |
7    | Milkbox  |   SA        |   1     |
 

с другим множеством результатов в таблице.

Я хочу сделать запрос SELECT * ИЗ продуктов, ГДЕ status= ‘SA’ ПОРЯДОК ПО местоположению ASC, …

Я хочу, чтобы моя сортировка выглядела так:

 ID   | Name     |   Status    |   Subid | Location
---------------------------------------------------------
4    | Chocolate|   SA        |         |  Box 2 // If it's parent result
3    | Kitkat   |   SA        |   4     |        // It's a child for Choco
5    | Twix     |   SA        |   4     |        // It's a child for Choco 
6    | Bounty   |   SA        |   4     |        // It's a child for Choco
1    | Milk     |   SA        |         |  Box 1 // If it's parent result
2    | MyDay    |   SA        |   1     |        // It's a child for Milk
7    | Milkbox  |   SA        |   1     |        // It's a child for Milk
 

После каждого родительского результата показывает, что его дочерние элементы подключены через subid к id

Есть ли какой-либо способ сделать это?

Заранее спасибо.

Комментарии:

1. Что вы подразумеваете под «заказом по всем продуктам»? Ни в одном из опубликованных вами примеров не показаны данные, отсортированные по Name .

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

3. покажите желаемый результат, это поможет нам понять ваш OP.

4. @maSTAShuFu это есть … просто недостаточно ясно, что второй результат является желаемым 🙂

5. @maSTAShuFu: OP уже сделал. Посмотрите на последнюю таблицу в вопросе.

Ответ №1:

Если я правильно понимаю, вы можете использовать:

 select t.*
from t
order by coalesce(subid, id),
         (case when subid is null then 1 else 2 end);
 

Вот скрипка db<> .

Комментарии:

1. Нет. Я хочу после каждого основного идентификатора сортировать каждый subid после него. В этом типе запроса сначала отсортируйте все продукты с пустыми вложенными идентификаторами, а затем сортируйте другие вложенные идентификаторы, где они не пусты.

2. @RossenVassilev . , , я не понимаю. Это возвращает именно тот порядок, который вы указали в вопросе.

Ответ №2:

Вы можете (самостоятельно) присоединиться к родительскому продукту и упорядочить его по местоположению или по местоположению дочернего продукта (если родительский продукт не найден) и subid не NULL выводить родительские продукты в начало для каждого местоположения.

 SELECT t1.*
       FROM elbat t1
            LEFT JOIN elbat t2
                      ON t2.id = t1.subid
       WHERE t1.status = 'SA'
       ORDER BY coalesce(t2.location,
                         t1.location),
                t1.subid IS NOT NULL;
 

Комментарии:

1. У меня есть только одна таблица. Оба столбца находятся в одной таблице.

2. @RossenVassilev: И мой запрос использует только одну таблицу … 😉

3. Пожалуйста, посмотрите мой отредактированный вопрос. Теперь вы меня понимаете? После каждого родительского результата отображаются его дочерние результаты. Теперь с помощью этого запроса я сначала показываю всех дочерних элементов для каждого родителя, а затем показываю всех родителей. В предложении WHERE у меня ошибка в синтаксисе mysql: «#1052 — Столбец ‘status’ в предложении where неоднозначен»

4. @RossenVassilev: Да, верно, я пропустил квалификацию status . Я исправил это.