如何在MySQL中连接联接表并连接笛卡尔积

5

我有三个表格:itemsjunctionproperties。我有五个物品(A到E)和五个属性(1到5)。通过连接表格,我已经分配了属性如下:

A: 1, 3, 5
B: 1, 2, 3
C: 1, 4, 5
D: 1, 2, 3
E: 1, 4, 5

当我运行以下查询时,我得到了一个美好的十五条记录的笛卡尔积(正如人们所期望的)。
SELECT I.id, I.item_name, P.property_name FROM scratch.items I
JOIN scratch.junction J ON J.item_id = I.id
JOIN scratch.property P ON J.property_id = P.id;

我想做的是将每个项目的属性名称连接成一个字段,以便我可以像这样输出它们:
Record  |  item_id  |  item_name  |  properties
----------------------------------------------------------------------------
     0  |  A        |  Item A     |  Property 1, Property 3, Property 5
     1  |  B        |  Item B     |  Property 1, Property 2, Property 3
     2  |  C        |  Item C     |  Property 1, Property 4, Property 5
     3  |  D        |  Item D     |  Property 1, Property 2, Property 3
     4  |  E        |  Item E     |  Property 1, Property 4, Property 5
----------------------------------------------------------------------------

与我在这里举的人为例子不同,每个项目都可以有任意数量的属性(包括零个)。


所以你真的在一个列中保存CSV数据。好吧,不要这样做。如果是这样,请参考连接表。规范化、速度和理智。 - Drew
不要在这里使用CSV。连接表只是指向另外两个表的主键的两个外键。我正在尝试这样做,因为我想创建一个易于阅读的视图,并且不想在我的应用逻辑中进行字符串拼接。 - Darkly
人类可读视图可以通过视图实现。只要您不希望使用 find_in_set() 进行连接以获得性能。做 group_concat() 来进行漂亮的打印是一回事,但期望一个经过良好调整的数据库引擎根据漂亮打印的输出获取数据则是另一回事。 - Drew
1个回答

4
您可以像这样使用group_concat函数:
SELECT I.id, I.item_name, group_concat(P.property_name) as properties
FROM scratch.items I
JOIN scratch.junction J ON J.item_id = I.id
JOIN scratch.property P ON J.property_id = P.id
group by I.id;

完美的解决方案,麦伟锋。这正是我正在寻找的。 - Darkly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接