请容忍我,我真的不善于解释,我甚至不知道这个问题的合适标题
好了,伙计们,我有个问题
我已经有一个表名为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表中创建一份套餐
也就是说,套餐可以有不限数量套餐
现在我不知道如何存储/链接套餐到套餐,我不想存储下面这样的东西
+------+--------------+-----------+-----------+
| 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列,我认为这不是存储数据的好方法
发布于 2011-01-26 21:04:36
创建多对多链接表:
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发布于 2011-01-26 21:05:05
不是的。这绝对不是存储数据的好方法。使用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!顺便说一下,在单个列中使用多个值违反了关系数据库的第一范式。
我提出的方法可以让你很容易地回答像get all name of The meals of combo1这样的问题。
发布于 2011-01-26 21:06:13
这就是餐饮和套餐之间的多对多关系。一餐可以在多个组合中列出,组合可以包含多个组合。您将需要一个包含所有可能的套餐组合对的链接表(而不是combo.meal_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
谷歌搜索“多对多关系”或“数据库链接表”以获取详细信息。
https://stackoverflow.com/questions/4804841
复制相似问题