Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列中有多个值的MySQL联接表_Mysql_Join - Fatal编程技术网

列中有多个值的MySQL联接表

列中有多个值的MySQL联接表,mysql,join,Mysql,Join,我有两张桌子: 产品: +-----------+-------------------------+ |product_id | colors | +-----------+-------------------------+ | 1 | 1001,1002,1004 | +-----------+-------------------------+ | 2 | 1005,1002,1001

我有两张桌子:

产品:

+-----------+-------------------------+
|product_id |          colors         |
+-----------+-------------------------+
|     1     |      1001,1002,1004     |
+-----------+-------------------------+
|     2     |      1005,1002,1001     |
+-----------+-------------------------+
颜色:

+--------------------+
|  id  |  color_rgb  |
+--------------------+
| 1001 | (24,251,89) |
+--------------------+
| 1002 |  (116,18,1) |
+--------------------+
| 1003 | (221,251,23)|
+--------------------+
| 1004 | (124,251,42)|
+--------------------+
我要做的就是像这样连接两个表:

SELECT * 
FROM products
JOIN colors ON (products.colors = colors.id)
但问题是,它只会显示类似的内容(比如对于product_id=1)


它只从颜色中获取第一个(1001)值。是否可以通过颜色“循环”并显示每个颜色?(或按颜色分组?[分组在这里不起作用])

如果我没有犯错误,这应该可以完成工作

如果要与字符串中的任何颜色匹配,可以使用
LIKE

SELECT * 
FROM products
JOIN colors ON (product.colors LIKE CONCAT('%,', colors.id, ',%') OR product.colors LIKE CONCAT(colors.id, ',%') OR product.colors LIKE CONCAT('%,', colors.id) OR product.colors = colors.id)

我认为这应该行得通,但目前无法亲自测试。

如果我没有犯错误,这应该行得通

如果要与字符串中的任何颜色匹配,可以使用
LIKE

SELECT * 
FROM products
JOIN colors ON (product.colors LIKE CONCAT('%,', colors.id, ',%') OR product.colors LIKE CONCAT(colors.id, ',%') OR product.colors LIKE CONCAT('%,', colors.id) OR product.colors = colors.id)

我认为这应该可以工作,但目前无法自己测试。

MySQL CONCAT函数用于连接两个字符串:将p.colors设置为100110021003格式,并将p.colors与c.id进行比较

例如:100110021003,(产品)带有%,1001,%(颜色)


MySQL CONCAT函数用于连接两个字符串:使p.colors的格式为100110021003,以及
compare
p.colors与c.id

例如:100110021003,(产品)带有%,1001,%(颜色)


为什么以世界上所有美好事物的名义,您将
颜色
存储为产品表中的csv数据?如果要处理多对多关系,您需要类似于
color\u to\u product
链接表的东西:我知道,但它已经构建了数据库,我必须使用它并进行一些查询。但我真的不知道如何将这两件事连接起来。这是可能的(某种程度上),但查询结果将非常复杂,执行情况非常糟糕(尤其是在大型数据集上),因此最好只将颜色数据拉入脚本中的数组中。当脚本在产品数据中循环时,它解析颜色并从颜色数组中分配RGB值。为什么以世界上所有美好事物的名义,您将
颜色
存储为产品表中的csv数据?如果要处理多对多关系,您需要类似于
color\u to\u product
链接表的东西:我知道,但它已经构建了数据库,我必须使用它并进行一些查询。但我真的不知道如何将这两件事连接起来。这是可能的(某种程度上),但查询结果将非常复杂,执行情况非常糟糕(尤其是在大型数据集上),因此最好只将颜色数据拉入脚本中的数组中。当脚本在产品数据中循环时,它解析颜色并从颜色数组中分配RGB值。毫无疑问,这一个仍然只显示第一个。但是谢谢。工作完美,你真了不起,杰斯特先生!!顺便说一句,你正在检查可能的concat,这样其中一个就可以“工作”了?或者这个是怎么工作的?没问题!我实际上忘记了一个案例,所以我在我的答案中添加了4个例子,要么ID是在字符串的开始,后面是逗号,然后是通配符,它在字符串的中间,所以前面有一个逗号,后面有通配符,它可以在结尾,只有一个,在前面,后面没有。或者如果只有一种颜色,我们通常会匹配它。希望这是有意义的是的,这是非常有意义的->它从左到右得到每一个,包括第一个。非常感谢你!(=首先,这一个仍然只是第一个给我看..但是谢谢.完美无瑕,你太棒了Jester先生!!顺便说一句,你正在检查可能的concats,这样其中一个会“起作用”?或者这一个是如何起作用的?没问题!我实际上忘记了一个案例,所以我在我的回答中添加了它有4个案例,或者id在st的开头后面跟着一个逗号,然后是通配符,它在字符串的中间,所以它前面有一个逗号,后面有通配符,它可以在结尾,只有一个,前面有一个,后面没有。如果只有一个颜色,我们通常会匹配它。希望这是有意义的xDead,它是完全有意义的。从左到右,包括第一个。非常感谢!(=谢谢解释!:):-)如果值在数据库中的格式为-1001-1002-1003-会更方便谢谢解释!:):-)如果数据库中的值是这种格式(1001-1002-1003),则会更方便
SELECT p.id as product_id, p.colors, c.id, c.color_rgb
FROM products p
INNER JOIN colors c ON (CONCAT(',', p.colors, ',') LIKE CONCAT('%,', c.id, ',%'))
ORDER BY p.id, c.id ASC