MySQL - объединение таблицы на основе 2 ключей из таблицы ключ / значение

0

У меня есть таблица настроек, которая может быть показана как: 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'

Пока я не тестировал последнее выражение, я уверен, что что-то подобное может работать. Этот запрос будет выполняться на потенциально сотни тысяч записей каждый час, поэтому я хочу, чтобы он оптимизировался - есть ли лучший способ сделать это?

Теги:
query-optimization

1 ответ

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
    Спасибо - именно то, что я искал - можно ли было указать значения, соответствующие этим ключам? if key = 'a' AND value = 'b'?
  • 0
    @ Керри: Извините? Это отдельные столбцы и значения, нет необходимости в JOIN или GROUP BY / HAVING
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню