Как использовать WHERE IN в подзапросе со значением из строкового столбца? - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблема с использованием 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 голосов
/ 19 февраля 2019

Вы можете присоединиться, используя 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;

enter image description here

Демо

Как правило, следует избегать хранения данных CSV в таблицах SQL.Данные CSV представляют собой ненормализованные данные, и с ними трудно работать (см. Вышеупомянутый запрос).Вместо этого разбейте каждый идентификатор службы на отдельную запись для достижения наилучших результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...