【问题标题】:Join statement for multiple values in the same column separated by comma同一列中多个值的连接语句,用逗号分隔
【发布时间】:2015-10-13 22:29:42
【问题描述】:

我有 2 个表如下:-

产品

   Product_name |  category_id

   Nutella      |  1,2
   Milk         |  3,4

类别

  cat_id        | name
     1          | dessert
     2          | chocolate
     3          | dairy
     4          | milk

我正在使用带有服务器端处理的数据表,使用SSP 库来显示产品表。

由于类别列包含逗号分隔的多个值,我需要创建连接语句来获取每个产品的类别!

有没有我可以使用 MYSQL 做到这一点?

编辑

预期输出

 Product_name |  category_id

   Nutella      |  dessert,chocolate
   Milk         |  diary,milk

【问题讨论】:

  • 您使用的是哪个 RDBMS?

标签: mysql sql tsql join datatable


【解决方案1】:

假设为SQL Server,首先可以使用CTE将行从逗号分隔的类别id中获取到行中,然后在cat_id上使用INNER JOIN,就可以得到想要的结果。

SEE DEMO SQL Server

;WITH CTEProduct (Product_name,category_id) 
AS
(
SELECT A.Product_name,  
     Split.a.value('.', 'VARCHAR(100)') AS category_id  
 FROM  
 (
     SELECT Product_name,  
         CAST ('<M>' + REPLACE(category_id, ',', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  Products
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)
) 

Select CTEProduct.category_id,CTEProduct.Product_name,Categories.name 
From CTEProduct 
     INNER JOIN Categories ON CTEProduct.category_id = Categories.cat_id

编辑:- 对于 MYSQL,我们必须遵循相同的方法,将逗号分隔的字符串转换为多行,然后进行 INNER JOIN。我不太了解如何将逗号分隔的字符串分隔到 MYSQL 中的行中,所以Refer Here。我在这里使用了相同的答案。

SEE DEMO MYSQL

Select tablename.Product_name,GROUP_CONCAT(Categories.name) name
From (
SELECT Product_name,SUBSTRING_INDEX(SUBSTRING_INDEX(t.category_id, ',', n.n), ',', -1) category_id
  FROM Products t CROSS JOIN 
(
   SELECT a.N + b.N * 10 + 1 n
     FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
   ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
    ORDER BY n
) n
 WHERE n.n <= 1 + (LENGTH(t.category_id) - LENGTH(REPLACE(t.category_id, ',', '')))
  ) tablename
  INNER JOIN Categories ON tablename.category_id = Categories.cat_id
  GROUP BY tablename.Product_name;

【讨论】:

  • 您确定,您之前在问题中指定您使用的是 MYSQL?
  • 其实看到你的回复后我更新了标签,抱歉。非常感谢您的帮助,但是有什么方法可以让每个产品的返回值成一行?
  • 用预期的输出更新你的问题,然后我有更好的主意。
  • 用想要的结果修改查询和DEMO
  • 您的意思是您的查询吗?我很难理解和更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
相关资源
最近更新 更多