具有多个键值对的SQL连接子

时间:2016-01-12 00:12:39

标签: mysql

我正在尝试为MySQL编写一个查询,选择所有父项,其中包含每个条件的子记录。我的架构比这更复杂,但这就是这个想法。

例如:

parent_table:

id,....

child_table

parent_id,id,key,value

所以,

{{1}}

如果我'或'他们在一起它很有效,但我需要它是独家的,而不是包容性的。

1 个答案:

答案 0 :(得分:1)

查询的问题是ct.key不能与同一行中的keyname1和keyname2相同。您需要多次检查子表或使用条件聚合。这是使用exists

的一个选项
SELECT id 
FROM parent_table pt
WHERE EXISTS (
   SELECT 1
   FROM child_table ct
   WHERE pt.id = ct.parent_id
      AND ct.key = 'keyName1' 
      AND ct.value = 'value1') AND EXISTS (
   SELECT 1
   FROM child_table ct
   WHERE pt.id = ct.parent_id
       ct.key = 'keyName2' AND 
       ct.value = 'value2')

或者您可以使用条件聚合:

select id
from parent_table pt 
where exists (
    select 1 
    from child_table ct 
    where pt.id = ct.parent_id
    group by ct.parent_id
    having sum(case when ct.key = 'keyname1' and ct.value = 'value1' 
               then 1 else 0 end) > 0 and 
          sum(case when ct.key = 'keyname2' and ct.value = 'value2' 
               then 1 else 0 end) > 0 )

使用distinct多个joins

时,可能还有另一个选项
select distinct pt.id
from parent_table pt
   join child_table ct1 on pt.id = ct1.parent_id and 
                           ct1.key = 'keyname1' and  
                           ct1.value = 'value1' 
   join child_table ct2 on pt.id = ct2.parent_id and 
                           ct2.key = 'keyname1' and  
                           ct2.value = 'value1'