如何将逗号分隔的字符串值转换为mySQL中的整数

时间:2014-09-22 05:47:13

标签: php mysql sql

我正在开发一个php项目来从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中执行此操作?

2 个答案:

答案 0 :(得分:1)

这是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表。它必须进行表扫描,因此最终会导致性能非常差,并且表变得越大就越糟糕。

答案 1 :(得分: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_purchase的假设是正确的,那么这将返回item_purchased列中所有项目的列表。