选择具有完全相同的多对多关联的记录

时间:2018-12-05 09:13:30

标签: mysql sql

我有2个表:rulesmeasure_units。一条规则有很多measure_units,而measure_unit有很多规则。因此,我们有了一个包含rule_idmeasure_unit_id的联接表。

现在,给定一个规则,我想选择完全相同相同度量单位的所有规则。

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

鉴于Rule2(以克和米为单位),我需要选择规则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)

但是此查询无法正常工作,因为选择所有具有至少个ID为1和2的度量单位的规则。因此,规则3也是如此。

可能与MySQL兼容的查询。

这里有一个数据库提琴:https://www.db-fiddle.com/f/vxg6vYjpSYJqN7sn83JLei/1在哪里尝试查询。

1 个答案:

答案 0 :(得分:1)

我将提取规则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表。