2014-09-22 60 views
1

我正在從php項目中檢索mysql數據。我有一個以逗號分隔的字符串存儲的代碼列表,該列表在另一個表中引用。有沒有辦法從字符串中獲取所有的值並返回它引用的文本?如何將由逗號分隔的字符串值轉換爲mySQL的整數

例如,item_purchased可能包含一個或多個item_code。我希望查詢返回項目名稱而不是項目代碼。

//item_purchased for transaction 123 --> ,111,222,333, 

SELECT s.transaction_id, s.item_purchased, i.item_id 
FROM stock s 

INNER JOIN ref_item i 
ON s.item_code = i.item_code 

WHERE transaction_id = 123 

Desired outcome: apple, carrot, milk (not ,111,222,333,) 

有沒有辦法做到這一點,最好在mySQL查詢或可能在PHP?

+0

這就是爲什麼你規範數據庫,這將是簡單的,如果你不使用逗號分隔列表。 – 2014-09-22 05:49:22

+0

爲什麼你不能在php中使用explode()後從數據庫中取出整個字符串 – Salini 2014-09-22 05:58:52

+0

查詢名稱列表,在數組中轉動字符串,你應該可以像'$ arr [$ item_id]' – RST 2014-09-22 05:59:51

回答

0

這是reasons why you shouldn't use comma-separated lists in relational databases之一。

解決方法是在連接條件中使用FIND_IN_SET() function而不是=

SELECT s.transaction_id, GROUP_CONCAT(i.item_name) 
FROM stock s 

INNER JOIN ref_item i 
ON FIND_IN_SET(i.item_code, s.item_purchased) 

WHERE s.transaction_id = 123 

GROUP BY s.transaction_id 

但不幸的是,這使查詢非常低效,因爲它不能使用索引來搜索ref_item表。它必須進行表掃描,所以它最終性能非常差,並且桌子越大,情況越糟糕。

+0

謝謝我不知道它有可能在mySQL中做到這一點。如果性能受到影響,我可能會在調用數據庫之前首先在PHP中進行轉換。 – Cryssie 2014-09-22 06:24:25

0

item_purchased一個逗號分隔的item_code字符串? 我不擅長與加入,但我認爲這會做

SELECT s.transaction_id, s.item_purchased, DISTINCT(i.item_id) 
    FROM stock s, ref_item i 
WHERE i.item_code in (s.item_purchased) 
    AND s.transaction_id = 123 

這將在item_purchased列返回的所有項目的列表,如果我的item_purchase的假設是正確的。

+0

這是一個語法錯誤。你不能像使用DISTINCT那樣使用DISTINCT。 – 2014-09-22 16:52:16

相關問題