2014-09-22 98 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

相关问题