我在将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
我知道这种模式不是最佳实践,但是我需要一些建议才能实现。
谢谢
答案 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;
通常,应避免在SQL表中存储CSV数据。 CSV数据代表未规范化的数据,并且难以使用(请参见上述查询)。相反,请将每个服务ID分开记录在单独的记录中,以获得最佳结果。