#mysql #sql #join
#mysql #sql #Присоединиться
Вопрос:
У меня есть две таблицы: одна, в главной таблице отображается день недели и суп в этот день. Таблица soups содержит список возможных супов.
----- ------------ --------
| id | day |id_soup |
----- ------------ --------
| 1 | Friday | 1 |
| 2 | Saturday | 1 |
| 3 | Sunday | 2 |
----- ------------ --------
----- ------------
| id | soup |
----- ------------
| 1 | potatoes |
| 2 | carrots |
| 3 | peas |
----- ------------
Чтобы получить пятничный суп (строка без идентификатора) Я могу использовать запрос, подобный этому:
SELECT ma.id, ma.day, ma.id_soup, so.soup
FROM main ma, soup so
WHERE ma.id_soup = so.id
AND ma.id = 1
Я получаю что-то вроде этого (ВЫВОД)
----- ------------ --------- ----------
| id | day | id_soup | soup |
----- ------------ --------- ----------
| 1 | Friday | 1 | potatoes |
----- ------------ --------- ----------
Это хорошо работает, если в пятницу доступен только один суп.
Проблема в том, что в пятницу будут доступны два супа (картофельный и гороховый — массив супов)
Нам нужна другая таблица?
ОТРЕДАКТИРОВАНО
----- --------- ---------
| id | id_day | id_soup |
----- --------- ---------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 2 | 3 |
| 5 | 3 | 1 |
| 6 | 3 | 3 |
----- --------- ---------
Возможно ли получить в одном запросе, в дополнение к другим полям основной таблицы (id, day, id_soup), массив супов (картофель, горох)?
Каков наилучший способ построения этого запроса?
ОТРЕДАКТИРОВАНО:
Желаемый результат (только для иллюстрации):
----- ------------ --------- ------------------
| id | day | id_soup | soup |
----- ------------ --------- ------------------
| 1 | Friday | 1 | potatoes, peas |
----- ------------ --------- ------------------
ОТРЕДАКТИРОВАНО
Вопрос: и если желаемый результат похож:
----- ------------ -------------------
| id | day | soup |
----- ------------ --------- ---------
| 1 | Friday | potatoes, carrots |
----- ------------ --------- ---------
| 2 | Saturday | carrots, peas |
----- ------------ --------- ---------
| 3 | Sunday | potatoes, peas |
----- ------------ --------- ---------
Комментарии:
1. Каков ваш желаемый результат…
2. Вы должны попытаться сопоставить свои данные с приведенным примером. В этом случае в пятницу должны быть картофель и горох. Также, пожалуйста, пометьте свою третью таблицу. И если у вас есть эта третья таблица, то вам не нужен идентификатор soup в
MAIN
таблице3. Спасибо Teja. Я отредактировал свою скрипку.
4. зачем вам нужен массив? и почему у id_soup тоже нет массива?
5. Спасибо Хуан. Этот пример вымышленный. На стороне клиента отображается день (пятница) и список супов в этот день (картофель, горох)
Ответ №1:
Да, вам понадобится промежуточная таблица, если есть несколько супов в день. Вы можете собрать все супы за день, используя GROUP_CONCAT
инструкцию in SELECT
.
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
SELECT ma.id, ma.day, GROUP_CONCAT(DISTINCT so.soup) as soup
FROM main ma
LEFT JOIN soupmain sm ON(ma.id = sm.id_main)
LEFT JOIN soup so ON(so.id = sm.id_soup)
WHERE ma.id = 1
GROUP BY ma.id
Комментарии:
1. Спасибо, Саймон, я попробую в своем запросе (эта часть является подробной) посмотреть, смогу ли я заставить его работать таким образом, и я получу желаемый результат. Еще раз спасибо.
2. Я отредактировал свой пост. Эти решения работают хорошо. Чтобы лучше изучить эту часть SQL, я сомневаюсь, что это лучший способ реализовать предложение GROUP_CONCAT, но для получения всей основной таблицы (пятница, суббота и воскресенье) суп. Есть предложения?
3. Тогда просто не ставьте
WHERE
и вы получите все дни из основной таблицы
Ответ №2:
Вы можете использовать group_concat
SELECT ma.day, groupconcat(so.soup)
FROM main ma, soup so
WHERE ma.id_soup = so.id
AND ma.id = 1
group by ma.day