我正在开发一个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中执行此操作?
答案 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
列中所有项目的列表。