Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在同一个表上具有多个条件的SQL select_Mysql_Sql_Database - Fatal编程技术网

Mysql 在同一个表上具有多个条件的SQL select

Mysql 在同一个表上具有多个条件的SQL select,mysql,sql,database,Mysql,Sql,Database,我在MySQL中有2个表,第一个表有2列:ID和name,第二个表有3列:firstTableId(第一个表上的外键)、key和value 我在表1中有以下行: 1、鲍勃 2、爱丽丝 3,弗雷德 我在表2中有以下行: 1岁,20岁 1,性别,男性 2岁,20岁 2,性别,女性 3岁,18岁 3,性别,男性 我想只使用第二个表(key和value)上的最后两列编写一个select查询,该表只返回第一个表中的Bob,但我似乎无法理解 基本上,我想从第一个表中选择所有行,在第二个表中,一行的k

我在MySQL中有2个表,第一个表有2列:ID和name,第二个表有3列:firstTableId(第一个表上的外键)、key和value

我在表1中有以下行:

  • 1、鲍勃
  • 2、爱丽丝
  • 3,弗雷德
我在表2中有以下行:

  • 1岁,20岁
  • 1,性别,男性
  • 2岁,20岁
  • 2,性别,女性
  • 3岁,18岁
  • 3,性别,男性
我想只使用第二个表(key和value)上的最后两列编写一个select查询,该表只返回第一个表中的Bob,但我似乎无法理解

基本上,我想从第一个表中选择所有行,在第二个表中,一行的key=age和value=20,另一行的key=gender和value=male。谁能给我指出正确的方向吗?操作表结构不是首选,因为这是一个简化的示例,第二个表中的“key”和“value”列几乎可以是任何内容,实际上并不限于“age”和“gender”


提前感谢。

您可以通过如下方式进行自连接:

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的功能,但是有很多方法

您可以看到它在这个

中工作。请使用两个in子句(或两个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);

您可能希望使用IN和子查询(可以进行丑陋的连接,但这些连接往往更糟糕),顺便说一下,这是一种可怕的数据库设计。访问复杂且缓慢,没有有用的索引,没有约束,CAN和MUST值之间没有差异。。。使用这种通用方法,您可以避免dbms对您的帮助。这很公平,但考虑到“键”和“值”必须是完全通用的(这两列的任何值都是可能的),并且表1和表2之间必须存在一对多关系,什么是更好的设计?我不明白为什么这些列必须有可能取值。年龄='car'或性别='saussage'实际上意味着什么?首先:表1可以包含除人员以外的任何内容吗?否则,为什么表中不包含两列age和SEQUENCE?(因此,确保年龄是一个数字,性别是“男性”或“女性”,空表示“未知”,而不是错误的“邮件”:)如果表1也可以包含宠物和喜爱的颜色,我发现很难想象数据库是用于什么的。我同意有些情况下泛型表是可以的,但这些情况很少。上面的例子是简化的,实际上它与人、年龄或性别无关,它是各种数据类型的不同属性(由键标识)的无界集合,我需要能够查询这些属性。我需要的是,对于表1中的每个记录,我可以查询的键值对的映射。生成的键集(即所有表1记录的所有映射的所有键集的并集)是无界的,并且可以随时间增长。此数据结构符合该要求。是的,这正是我想要的,而且由于这些条款的数量相对有限(目前最多3条),性能影响应该是可以接受的,谢谢:)Upvoting。
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);