前言:是的我意识到这是糟糕的设计,但我无法改变这一点。
问题
我有一个客户表,在那个字段'产品'中。以下是示例客户产品字段中的示例:
36;40;362
这些数字中的每一个都引用了产品表中的记录。我正在尝试做一个
(SELECT group_concat(productName) from products where productID=???)
但是我遇到了分隔符问题。我知道如何删除半冒号,并试过'INSTR'或IN但没有运气。
将整个字段返回给PHP然后在那里爆炸/解析是最好的方法吗?
答案 0 :(得分:4)
您可以在MySQL中使用FIND_IN_SET
功能。
您只需要用逗号替换分号并在查询中使用它:
SELECT group_concat(productName)
FROM products
WHERE FIND_IN_SET(productID, ???) > 0
请记住,???
应以逗号分隔!
答案 1 :(得分:2)
就像你说的,这不是这样做的方法。但由于这是一个不完美的世界:
假设数据库结构如此:
+-PRODUCTS---------+ +-CUSTOMERS---------+------------+
| ID | productName | | ID | customerName | productIDs |
+----+-------------+ +----+--------------+------------+
| 1 | Foo | | 1 | Alice | 1;2 |
+----+-------------+ +----+--------------+------------+
| 2 | Bar | | 2 | Bob | 2;3 |
+----+-------------+ +----+--------------+------------+
| 3 | Baz | | 3 | Charlie | |
+----+-------------+ +----+--------------+------------+
然后是这样的查询:
SELECT customers.*,
GROUP_CONCAT(products.id) AS ids,
GROUP_CONCAT(productName) AS names
FROM customers
LEFT JOIN products
ON FIND_IN_SET(products.id, REPLACE(productIDs, ";", ","))
GROUP BY customers.id
会回来:
+-RESULT------------+------------+-----+---------+
| ID | customerName | productIDs | ids | names |
+----+--------------+------------+-----+---------+
| 1 | Alice | 1;2 | 1,2 | Foo,Bar |
+----+--------------+------------+-----+---------+
| 2 | Bob | 2;3 | 1,2 | Bar,Baz |
+----+--------------+------------+-----+---------+
| 3 | Charlie | | 1,2 | NULL |
+----+--------------+------------+-----+---------+
FIND_IN_SET( search_value, comma_separated_list )
搜索给定逗号分隔字符串中的值。因此,您需要用逗号替换分号,这显然是REPLACE()
所做的。此函数的返回值是找到第一个匹配项的位置,例如:
SELECT FIND_IN_SET(3, '1,3,5') = 2
SELECT FIND_IN_SET(5, '1,3,5') = 3
SELECT FIND_IN_SET(7, '1,3,5') = NULL