Mysql, сохраняя несколько значений в одном столбце из другой таблицы
Потерпите меня, я очень плохо разбираюсь в этом, и я даже не знаю подходящего названия для этой проблемы
Хорошо, ребята, у меня есть эта проблема
У меня уже есть одно имя таблицы meal
+------+--------+-----------+---------+
| id | name | serving | price |
+------+--------+-----------+---------+
| 1 | soup1 | 2 person | 12.50 |
+------+--------+-----------+---------+
| 2 | soup2 | 2 person | 15.50 |
+------+--------+-----------+---------+
| 3 | soup3 | 2 person | 23.00 |
+------+--------+-----------+---------+
| 4 | drink1 | 2 person | 4.50 |
+------+--------+-----------+---------+
| 5 | drink2 | 2 person | 3.50 |
+------+--------+-----------+---------+
| 6 | drink3 | 2 person | 5.50 |
+------+--------+-----------+---------+
| 7 | frui1 | 2 person | 3.00 |
+------+--------+-----------+---------+
| 8 | fruit2 | 2 person | 3.50 |
+------+--------+-----------+---------+
| 9 | fruit3 | 2 person | 4.50 |
+------+--------+-----------+---------+
Хорошо теперь я хочу разрешить администратору создавать комбо-питание из этой таблицы meal
Таким образом, это означает, что комбинированная еда может иметь неограниченное количество еды
В настоящее время головоломка, как хранить/связывать комбинированную еду с едой
Я не хочу хранить что-то lke ниже
+------+--------------+-----------+-----------+
| id | combo_name | serving | meal_id |
+------+--------------+-----------+-----------+
| 1 | combo1 | 2 person | 1,4,7,9 |
+------+--------------+-----------+-----------+
| 2 | combo2 | 2 person | 2,5,8 |
+------+--------------+-----------+-----------+
| 4 | combo3 | 2 person | 3,5,6,9 |
+------+--------------+-----------+-----------+
Посмотрите на столбец meal_id
, я не думаю, что это хороший способ хранения данных
Ответы
Ответ 1
Создайте таблицу ссылок "многие-ко-многим":
combo_id meal_id
1 1
1 4
1 7
1 9
2 2
2 5
2 8
3 3
3 5
3 6
3 9
Чтобы выбрать все блюда для данного комбо:
SELECT m.*
FROM combo_meal cm
JOIN meal m
ON m.id = cm.meal_id
WHERE cm.combo_id = 1
Ответ 2
Нет. Это определенно не хороший способ хранения данных. Вам будет лучше с таблицей combo_header
и таблицей combo_details
.
combo_header
будет выглядеть примерно так:
+------+--------------+-----------+
| id | combo_name | serving |
+------+--------------+-----------+
| 1 | combo1 | 2 person |
+------+--------------+-----------+
| 2 | combo2 | 2 person |
+------+--------------+-----------+
| 4 | combo3 | 2 person |
+------+--------------+-----------+
И тогда combo_details
будет выглядеть примерно так:
+------+-----------+
| id | meal_id |
+------+-----------+
| 1 | 1 |
+------+-----------+
| 1 | 4 |
+------+-----------+
| 1 | 7 |
+------+-----------+
| 1 | 9 |
+------+-----------+
... / you get the idea!
Кстати, используя несколько значений в одном столбце, вы нарушаете первую нормальную форму реляционных баз данных.
Способ, который я предлагаю, позволит вам отвечать на запросы, как получить все названия блюд combo1 очень легко решить.
Ответ 3
Это называется отношением "многие ко многим" между приемами пищи и комбо. Еда может быть перечислена в нескольких комбо, а комбо может содержать несколько приемов пищи. Вам понадобится таблица ссылок (вместо поля combo.meal_id), которая содержит все возможные парные комбинации еды.
В конце концов, у вас будет три таблицы:
- еда (еда, подача, имя)
- комбо (combo_id, обслуживание, имя)
- meal_combo (autoid, meal_id, combo_id)
meal_combo.autoid не является строго необходимым, это всего лишь общая рекомендация.
Перечислить комбо со всеми его приемами в нем:
SELECT meal.id, meal.name FROM comboINNER JOIN meal_combo ON meal_combo.combo_id = combo.id INNER JOIN meal ON meal.id = meal_combo.meal_id WHERE combo.id = 132
Google для связи "многие-ко-многим" или "таблицы ссылок базы данных" для деталей.