如何在带有字符串列值的子查询中使用WHERE IN?

时间:2019-02-19 07:34:32

标签: mysql sql

我在将WHERE IN与列值一起使用时遇到问题

我有如下数据

表格服务

id  name            sd_ids
1   House Cleaning  1,2

表格服务详细信息

id  name
1   living room
2   bedroom

模式

CREATE TABLE IF NOT EXISTS `service` (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(200) NOT NULL,
  `sd_ids` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `service` (`id`, `name`,`sd_ids`) VALUES
 ('1','House Cleaning','1,2');

 CREATE TABLE IF NOT EXISTS `service_detail` (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `service_detail` (`id`, `name`) VALUES
('1','living room'),
 ('2','bedroom');

我已经尝试过了

SELECT *,
  (
   SELECT 
     GROUP_CONCAT(name) 
   from service_detail 
     where id in(service.sd_ids)
  ) as service_detail
FROM service;

但是结果不是我想要的

id  name            sd_ids  service_detail
1   House Cleaning  1,2     living

我将架构和测试放在这里 http://sqlfiddle.com/#!9/49c34e/7

我想要实现以显示如下结果

id  name            sd_ids  service_detail
1   House Cleaning  1,2     living room,bedroom

我知道这种模式不是最佳实践,但是我需要一些建议才能实现。

谢谢

1 个答案:

答案 0 :(得分:1)

您可以在加入条件中使用FIND_IN_SET进行加入:

SELECT
    s.id,
    s.name,
    s.sd_ids,
    GROUP_CONCAT(sd.name ORDER BY sd.id) AS service_detail
FROM service s
INNER JOIN service_detail sd
    ON FIND_IN_SET(sd.id, s.sd_ids) > 0
GROUP BY
    s.id,
    s.name,
    s.sd_ids;

Model Graph

enter image description here

通常,应避免在SQL表中存储CSV数据。 CSV数据代表未规范化的数据,并且难以使用(请参见上述查询)。相反,请将每个服务ID分开记录在单独的记录中,以获得最佳结果。