2010-09-30 61 views
0

我有设置的表,其可以被示出为: 的object_id(INT) 键(VARCHAR) 值(文本)的MySQL - 加入根据2个密钥的表从一个键/值表

我试图抓住具有等于2项的键的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' 

虽然我没有测试过的最后一条语句,我肯定这样的事情可以工作。这个查询将每小时执行数十万条记录,所以我想保持它的优化 - 有没有更好的方法来做到这一点?

回答

2

哦,你想:

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

用途:

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' 
+0

感谢 - 正是我一直在寻找的 - 这将是可以指定值来匹配那些键?如果'key' ='a'AND'value' ='b'? – 2010-09-30 21:33:45

+0

@Kerry:对不起?那些是不同的列和值,不需要JOIN或GROUP BY/HAVING – 2010-09-30 21:36:32

+0

是的 - 我的头脑现在有点混乱,画几个空白,谢谢 - 你的解决方案是完美的(不知道第一个是可能) – 2010-09-30 21:39:02