Объединить две таблицы и получить из одной таблицы массив значений

#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