У меня есть таблица настроек, которая может быть показана как: object_id (int) ключ (varchar) значение (текст)
Я пытаюсь захватить object_id, у которого есть ключ, равный 2 элементам.
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
Использование:
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'
key
= 'a' ANDvalue
= 'b'?