我的表中有逗号分隔值,tbl_request如下:
request_id name1 price
4 12,14 99.23
从这个表中我需要根据值name1(即12,14)从另一个表中查找数据。我试过以下代码
SELECT
r.price,
(
SELECT
GROUP_CONCAT(pd.product_name)
FROM
tbl_products AS pd
WHERE
(
pd.product_id IN(GROUP_CONCAT(r.name1))
)
) as xyz
FROM
tbl_request AS r
WHERE
r.request_id = 4
我需要在逗号分隔值中获取name1中id的产品名称。但是使用上面的代码我只能获得一个值。我该如何解决这个问题?
答案 0 :(得分:4)
您的数据结构已损坏。以下是它不好的原因:
修复您的数据并将值放入正确的联结表中,并使用正确的类型和外键关系。
有时,我们会遇到其他人非常糟糕,糟糕,糟糕,糟糕,糟糕的设计决策。 MySQL提供find_in_set()
可以帮助达到这个目的:
SELECT r.price, GROUP_CONCAT(pd.product_name) as xyz
FROM tbl_request r LEFT JOIN
tbl_products p
ON find_in_set(p.product_id, r.name1) > 0
WHERE r.request_id = 4
GROUP BY r.price;
答案 1 :(得分:3)
您可以使用FIND_IN_SET
:
SELECT *
FROM yourTable
WHERE FIND_IN_SET('12', name1) > 0; -- a non-zero value means a match
以上对FIND_IN_SET
的调用会搜索name1
列,其中包含CSV字符串,其值12
显示为任意值。
请注意,将CSV数据存储在数据库表中通常是不好的做法,因为它表示非标准化数据,并且您可能会遇到性能不佳。