我有2个表:rules
和measure_units
。一条规则有很多measure_units,而measure_unit有很多规则。因此,我们有了一个包含rule_id
和measure_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在哪里尝试查询。
答案 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
表。