我在MySQL中有2个表,第一个有2列:ID和名称,第二列有3列:firstTableId(第一个表上的外键),键,值。
表1中有以下行:
表2中有以下行:
我想只使用第二个表(键和值)上的最后两列来编写一个select查询,它只返回第一个表中的Bob,但我似乎无法弄明白。
基本上我想从第一个表中选择所有行,在第二个表中,我们有一行的key = age和value = 20,而另一行中的key = gender和value = male。谁能指出我正确的方向?操作表结构不是优选的,因为这是一个简化的例子,并且" key"和"价值"第二个表中的列可以是几乎任何东西,它实际上并不限于" age"和"性别"。
提前致谢。
答案 0 :(得分:5)
您可以使用以下自我联接来执行此操作:
select
*
from
table1 t1
inner join table2 age on t1.id = age.id
inner join table2 gender on t1.id = gender.id
where
(age.`key` = 'age' and age.value = 20)
and
(gender.`key` = 'gender' and gender.value = 'male')
您可能想要尝试的其他策略是PIVOT查询。 Mysql没有任何原生支持pivot的东西,但有several examples如何做到这一点。
您可以在此fiddle
中看到它正常工作答案 1 :(得分:4)
使用两个IN子句(或两个EXISTS子句)。
select *
from table1
where id in (select firstTableId from table2 where key = 'age' and value = '20')
and id in (select firstTableId from table2 where key = 'gender' and value = 'male');
使用EXISTS:
select *
from table1
where exists (select * from table2 where key = 'age' and value = '20' and firstTableId = table1.firstTableId)
and exists (select * from table2 where key = 'gender' and value = 'male' and firstTableId = table1.firstTableId);