根据逗号分隔值

时间:2018-03-16 11:26:33

标签: php mysql sql

我的表中有逗号分隔值,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的产品名称。但是使用上面的代码我只能获得一个值。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您的数据结构已损坏。以下是它不好的原因:

  • 将数字存储为字符串是不好的。
  • SQL数据库中的列应该有一个值。
  • SQL的字符串操作支持很差。
  • 应正确定义外键关系(并且不能使用列表执行此操作)。
  • 字符串操作排除了索引的使用。

修复您的数据并将值放入正确的联结表中,并使用正确的类型和外键关系。

有时,我们会遇到其他人非常糟糕,糟糕,糟糕,糟糕,糟糕的设计决策。 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数据存储在数据库表中通常是不好的做法,因为它表示非标准化数据,并且您可能会遇到性能不佳。