Выберите записи с одинаковыми много-много ассоциаций - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть 2 таблицы: rules и measure_units.Правило имеет много измерений measure_units и measure_unit has_many.Итак, у нас есть таблица соединения с rule_id и measure_unit_id.

Теперь, учитывая правило, я хочу выбрать все правила с точно одинаковыми единицами измерения.

rule1 => grams
rule2 => grams,meters
rule3 => grams,meters,litre
rule4 => meters
rule5 => grams,meters
rule6 => litre,grams

Учитывая правило 2 (с граммами и метрами), мне нужно выбрать правила 2 и 5.

Моя попытка была:

SELECT `rules`.* FROM `rules`
LEFT JOIN `measurables` ON `measurables`.`rule_id` = `rules`.`id`
LEFT JOIN `measure_units` ON `measure_units`.`id` = `measurables`.`measure_unit_id`
WHERE `measure_units`.`id` IN (1,2)
GROUP BY `measurables`.`rule_id`
HAVING (count(*) = 2)

Но этот запрос не работает, потому чтовыберите все правила, которые имеют как минимум единицы измерения с идентификаторами 1 и 2. Так же и правило 3.

Возможен запрос, совместимый с MySQL.

Здесь дБ-fiddle: https://www.db -fiddle.com / f / vxg6vYjpSYJqN7sn83JLei / 1 , где попробовать запрос.

1 Ответ

0 голосов
/ 05 декабря 2018

Я бы выделил единицы для правила 2 и сравнил бы это со всеми другими правилами.MySQL делает это проще, используя group_concat:

select r.*
from (select m.rule_id,
             group_concat(m.measure_unit_id order by measure_unit_id) as measure_unit_ids
      from measurables m
      group by m.rule_id
     ) r join
     (select group_concat(m.measure_unit_id order by measure_unit_id) as measure_unit_ids
      from measurables m
      where m.rule_id = 2
     ) r2
     on r.measure_unit_ids = r2.measure_unit_ids

Если вам нужна дополнительная информация о правилах, вы можете присоединиться к таблице rules.

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