Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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-基于键/值表中的2个键连接表_Sql_Mysql_Query Optimization - Fatal编程技术网

MySQL-基于键/值表中的2个键连接表

MySQL-基于键/值表中的2个键连接表,sql,mysql,query-optimization,Sql,Mysql,Query Optimization,我有一个设置表,可以显示为: 对象id(int) 密钥(varchar) 值(文本) 我正在尝试获取具有等于2个项的键的对象_id SELECT `object_id` FROM `settings` WHERE `key` = 'A' AND `key` = 'B' 我知道这是行不通的,我能想到的唯一办法就是自己加入其中: SELECT a.`object_id` FROM `settings` AS a LEFT JOIN `settings` AS b ON ( a.`object_id

我有一个设置表,可以显示为: 对象id(int) 密钥(varchar) 值(文本)

我正在尝试获取具有等于2个项的键的对象_id

SELECT `object_id` FROM `settings` WHERE `key` = 'A' AND `key` = 'B'
我知道这是行不通的,我能想到的唯一办法就是自己加入其中:

SELECT a.`object_id` FROM `settings` AS a LEFT JOIN `settings` AS b ON ( a.`object_id` = b.`object_id` ) WHERE a.`key` = 'A' and b.`key` = 'B'
虽然我还没有测试上一句话,但我相信类似的方法可以奏效。此查询每小时可能会对数十万条记录执行,因此我希望对其进行优化--有更好的方法吗?

哦,您希望:

  SELECT `object_id` 
    FROM `settings`  
   WHERE (`key` = 'A' AND `value`='foo') 
      OR (`key`= 'B' AND `value`='bar')
GROUP BY `object_id`
  HAVING COUNT(*) = 2
使用:

或:


谢谢——这正是我想要的——可以指定与这些键匹配的值吗?如果
='a'和
='b'?@Kerry:对不起?这些是不同的列和值,不需要通过/having进行连接或分组是的--我的头脑现在有点糊涂,画了一些空白,谢谢--你的解决方案很完美(不知道第一个是可能的)@Kerry:是的,只需添加单独的子句:`WHERE(`key`='a'和`value`='foo')或(`key`='B'和`value`='bar'))`@Wrikken——它需要两个键存在并具有指定的值——而不是一个或另一个。我对这个问题的措辞很糟糕,但@OMG Ponies在我提问时回答了这个问题,这给了我一些很好的数据。
  SELECT `object_id` 
    FROM `settings`  
   WHERE `key` IN ('A', 'B')
GROUP BY `object_id`
  HAVING COUNT(DISTINCT `key`) = 2
SELECT x.`object_id` 
  FROM `settings` AS x 
  JOIN `settings` AS y ON y.`object_id` = x.`object_id`  
 WHERE x.`key` = 'A' 
   AND y.`key` = 'B'