MySQL通过一个字段加入多条记录

问题描述:

我正在使用这种情况,它是关于连接两个表并返回多条记录。MySQL通过一个字段加入多条记录

让我们假设我有两个表是这样的:

表产品:

+----+-----------+-----------+ 
| id | name | media_id | 
+----+-----------+-----------+ 
| 1 + product 1 + 32,33,34 + 
+----+-----------+-----------+ 
media_id(VARCHAR(50)) 

表媒体:

+----+-----------+------------------------------------------+ 
| id | name |     path     + 
+----+-----------+------------------------------------------+ 
| 31 + media 1 +  localhost://uploads/image/image_1 + 
+----+-----------+------------------------------------------+ 
| 32 + media 2 +  localhost://uploads/image/image_2 + 
+----+-----------+------------------------------------------+ 
| 33 + media 3 +  localhost://uploads/image/image_3 + 
+----+-----------+------------------------------------------+ 
| 34 + media 4 +  localhost://uploads/image/image_4 + 
+----+-----------+------------------------------------------+ 

我试图用JOINWHERE IN条款:

SELECT 
m.id, 
m.name as media_name, 
p.name, 
p.media_id 

FROM 
media as m 
JOIN product as p 

on m.id in (p.media_id); 

JOIN条款,但返回的结果是:

+----+-----------+-----------+------------+-------------------------+ 
| id | name | image_id | media_name +   path   + 
+----+-----------+-----------+------------+-------------------------+ 
| 1 + product 1 + 32,33,34 + media 2 + uploads/image/image_1 + 
+----+-----------+-----------+------------+-------------------------+ 

我要的是返回结果有3条是这样的:

+----+-----------+-----------+------------+-----------------------+ 
| id | name | image_id | media_name +   path   + 
+----+-----------+-----------+------------+-----------------------+ 
| 1 + product 1 +  32 + media 2 + uploads/image/image_2 + 
+----+-----------+-----------+------------+-----------------------+ 
| 2 + product 1 +  33 + media 3 + uploads/image/image_3 + 
+----+-----------+-----------+------------+-----------------------+ 
| 3 + product 1 +  34 + media 4 + uploads/image/image_4 + 
+----+-----------+-----------+------------+-----------------------+ 

有谁知道如何连接表这样吗?

+2

修复您的模式。见正常化。 – Strawberry

+0

@Strawberry我明白image_id的普通模式是'int',我可以制作更多的列,比如'image_id_2','image_id_3','image_id_4'。但在我的情况下,我需要将'image_id'列更改为'VARCHAR' –

+1

很明显,你不明白。但不要绝望。规范化的基本原则实际上很容易理解(毕竟我设法理解它)! – Strawberry

为了实现您要查找的内容,需要对数据库模式稍作更改,从产品表中删除逗号分隔值。

然后,您可以使用链接表,然后您可以查询连接。

产品

| id | name  | 
|----|-----------| 
| 1 | product 1 | 
| 2 | product 2 | 
| 3 | product 3 | 

product_media链接

| id | product_id | media_id | 
|----|------------|----------| 
| 1 | 1   | 1  | 
| 2 | 1   | 2  | 
| 3 | 1   | 3  | 

然后,您可以做检查链接表并返回您正在寻找的多行结果的查询。

例如

SELECT 
m.id, 
m.name as media_name, 
p.name as product_name 
m.path 

FROM 
media as m 
LEFT JOIN product_media_links as pl on m.id = pl.media_id 
LEFT JOIN products as p on p.id = pl.product_id 

使用左加入到无的产品来回报媒体,如果你愿意的话

另外,作为由别人提及,看看正常化。它在设计数据库时确实有帮助,并且您可以选择想要使用它的距离。

+0

是的,我理解修改DB架构的情况。我使用这种类型的数据库为我的网站,功能上传多个图像,我认为使用领域media_id作为VARCHAR比INT好,我的意思是将媒体分成“media_id,media_id,media_id”要好于将其分成3条记录 –

+0

您可以使用以逗号分隔的列表,是的,但是您也会发现使用ID进行索引并使用链接表可为您提供更快的结果,而且您​​的连接也不会以逗号分隔的列表作为字符串工作,这是原始问题你的代码在上面。 https://*.com/questions/2346920/sql-select-speed-int-vs-varchar – WillHazell