#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
. Я исправил это.