首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql,将多个值存储在另一个表的单个列中

Mysql,将多个值存储在另一个表的单个列中
EN

Stack Overflow用户
提问于 2011-01-26 21:02:08
回答 3查看 22K关注 0票数 10

请容忍我,我真的不善于解释,我甚至不知道这个问题的合适标题

好了,伙计们,我有个问题

我已经有一个表名为meal

代码语言:javascript
复制
+------+--------+-----------+---------+
|  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表中创建一份套餐

也就是说,套餐可以有不限数量套餐

现在我不知道如何存储/链接套餐到套餐,我不想存储下面这样的东西

代码语言:javascript
复制
+------+--------------+-----------+-----------+
|  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列,我认为这不是存储数据的好方法

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-26 21:04:36

创建多对多链接表:

代码语言:javascript
复制
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

要选择给定组合的所有套餐,请执行以下操作:

代码语言:javascript
复制
SELECT  m.*
FROM    combo_meal cm
JOIN    meal m
ON      m.id = cm.meal_id
WHERE   cm.combo_id = 1
票数 23
EN

Stack Overflow用户

发布于 2011-01-26 21:05:05

不是的。这绝对不是存储数据的好方法。使用combo_header表和combo_details表会更好。

combo_header将类似于:

代码语言:javascript
复制
+------+--------------+-----------+
|  id  |  combo_name  | serving   |
+------+--------------+-----------+
|  1   |   combo1     |  2 person |
+------+--------------+-----------+
|  2   |   combo2     |  2 person |
+------+--------------+-----------+
|  4   |   combo3     |  2 person |
+------+--------------+-----------+

然后,combo_details将类似于:

代码语言:javascript
复制
+------+-----------+
|  id  |  meal_id  |
+------+-----------+
|  1   |  1        |
+------+-----------+
|  1   |  4        |
+------+-----------+
|  1   |  7        |
+------+-----------+
|  1   |  9        |
+------+-----------+
... / you get the idea!

顺便说一下,在单个列中使用多个值违反了关系数据库的第一范式。

我提出的方法可以让你很容易地回答像get all name of The meals of combo1这样的问题。

票数 4
EN

Stack Overflow用户

发布于 2011-01-26 21:06:13

这就是餐饮和套餐之间的多对多关系。一餐可以在多个组合中列出,组合可以包含多个组合。您将需要一个包含所有可能的套餐组合对的链接表(而不是combo.meal_id字段)。

最后,您将拥有三个表:

  1. meal (meal_id,serving,name)
  2. 组合(combo_id,serving,name)
  3. 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

谷歌搜索“多对多关系”或“数据库链接表”以获取详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4804841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档