Php mysql字段中带分隔符的外部ID
前言:是的,我知道这是一个糟糕的设计,但我不能改变这个 问题: 我有一个客户表,其中有一个字段“产品”。以下是示例客户产品字段中的示例:Php mysql字段中带分隔符的外部ID,php,mysql,split,explode,Php,Mysql,Split,Explode,前言:是的,我知道这是一个糟糕的设计,但我不能改变这个 问题: 我有一个客户表,其中有一个字段“产品”。以下是示例客户产品字段中的示例: 36;40;362 这些数字中的每一个都引用了products表中的一条记录。我正试着做一件事 从productID=?的产品中选择组\u concatproductName 但是我在分隔符方面遇到了麻烦。我知道如何去掉分号,也试过“where INSTR”或IN,但运气不好 将整个字段返回到PHP然后在那里分解/解析的最佳方法是什么?您可以在MySQL中使
36;40;362
这些数字中的每一个都引用了products表中的一条记录。我正试着做一件事
从productID=?的产品中选择组\u concatproductName
但是我在分隔符方面遇到了麻烦。我知道如何去掉分号,也试过“where INSTR”或IN,但运气不好
将整个字段返回到PHP然后在那里分解/解析的最佳方法是什么?您可以在MySQL中使用函数
您只需将分号替换为逗号,然后在查询中使用它:
SELECT group_concat(productName)
FROM products
WHERE FIND_IN_SET(productID, ???) > 0
记得吗???应该用逗号分隔 您可以在MySQL中使用函数
您只需将分号替换为逗号,然后在查询中使用它:
SELECT group_concat(productName)
FROM products
WHERE FIND_IN_SET(productID, ???) > 0
记得吗???应该用逗号分隔 就像你说的,这不是做这件事的方法。但既然这是一个不完美的世界: 假设这样的数据库结构:
+-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 |
+----+--------------+------------+-----+---------+
查找集合搜索值中的值,逗号分隔列表搜索给定逗号分隔字符串中的值。因此,您需要用逗号替换分号,这显然是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
就像你说的,这不是解决问题的方法。但既然这是一个不完美的世界: 假设这样的数据库结构:
+-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 |
+----+--------------+------------+-----+---------+
查找集合搜索值中的值,逗号分隔列表搜索给定逗号分隔字符串中的值。因此,您需要用逗号替换分号,这显然是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