MySql 在一个单元格中存储另一个表的多个引用并选择它?

Joh*_*hnA 5 php mysql select

我有两张桌子

table: people 

id name goods_owned
1  john   1,4,3
2  Mike   2,5
3  Sam    1,5,2
4  Andy   5,3,4
Run Code Online (Sandbox Code Playgroud)

——

table goods:

  g_id g_name  g_class
    1   sugar  food
    2   salt   food
    3   boat   transp
    4   house  habitation
    5   car    transp
Run Code Online (Sandbox Code Playgroud)

这是一个简单的桌子例子,goods它实际上很长,每个人people可以有多个goods分配给他,例如汽车、船、糖等,一个人可以拥有多少没有限制,并且完全随机。我找不到比昏迷分离更好的存储方法,例如1,5,3

我在进行选择时遇到问题,我需要例如

SELECT people.*, goods.name
   FROM people
      LEFT JOIN  goods ON goods.g_id = people.goods_owned
         WHERE name = "Sam"
Run Code Online (Sandbox Code Playgroud)

然而问题是goods_owned在单元格中有多个商品ID,需要以某种方式分解它们才能得到答案:

1, Sam, sugar, car, salt
Run Code Online (Sandbox Code Playgroud)

如果您知道在一个单元格中存储(例如 100)多个昏迷值的更好替代方法,请告诉我。

spe*_*593 3

一个人可以与零个、一个或多个商品相关。一件商品可以与零个、一个或多个人相关。

这是一个多对多的关系。

通常,我们通过创建第三个表来处理此问题,该表是指向其他两个表的“关系”

table: goods_owned
people_id goods_id
        1        1
        1        4
        1        3
        2        2
        2        5
        3        1
        3        5
        3        2
        4        5
        4        3
        4        4    
Run Code Online (Sandbox Code Playgroud)

这两列的组合可以指定为唯一的,并且可以作为表的主键。每列都可以定义为父表的外键。

CREATE TABLE goods_owned
( people_id  INT UNSIGNED NOT NULL
, goods_id   INT UNSIGNED NOT NULL
, PRIMARY KEY (people_id, goods_id)
-- , KEY FK_goods_owned_people (people_id)  -- redundant with PK
, KEY FK_goods_owned_goods (goods_id)
, CONSTRAINT FK_goods_owned_people FOREIGN KEY (people_id) REFERENCES people (id)
, CONSTRAINT FK_goods_owned_goods FOREIGN KEY (goods_id) REFERENCES goods (g_id)
) ;
Run Code Online (Sandbox Code Playgroud)

另一种选择是,如果“商品”集合是静态且定义明确的,并且不需要在表中表示,那么您可以使用 MySQL SET 数据类型,并拥有一个表。但这种方法仅适用于静态集合(不需要更改)。