MySQL-基于键/值表中的2个键连接表
我有一个设置表,可以显示为: 对象id(int) 密钥(varchar) 值(文本) 我正在尝试获取具有等于2个项的键的对象_idMySQL-基于键/值表中的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
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'