2012-10-09 93 views
1

前言:是的,我意識到這是不好的設計,但我不能改變這一點。分隔外國ID在mysql字段

問題

我有一個客戶表,一個字段 '產品' 範圍內。以下是示例客戶產品字段中的示例:

36;40;362 

每個數字都引用產品表中的記錄。我試圖做一個

(SELECT group_concat(productName) from products where productID=???)

但我有帶分隔符的麻煩。我知道如何去除分號,並嘗試過'INSTR'或'INS'但沒有運氣。

將整個字段返回到PHP然後在那裏爆炸/解析是最好的方法嗎?

回答

4

您可以在MySQL中使用FIND_IN_SET函數。

你只需要一個逗號,並在查詢中使用它來代替分號:

SELECT group_concat(productName) 
FROM products 
WHERE FIND_IN_SET(productID, ???) > 0 

只要記住,???應該是逗號分隔的!

+0

工作 - 真棒thx。 – drschultz

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