2016-05-17 5 views
-3
select * from q_and_a qa 
where keyword = :keyword_top 
    or id in (
    select qk.question_id 
    from question_keywords qk 
    inner join q_and_a qa on qa.id = qk.question_id 
    inner join keywords k on k.id = qk.keyword_id 
    where k.keyword = :keyword_bottom 
) 
+0

Вопросы по настройке запросов часто встречаются здесь, и вы должны прочитать некоторые из них. И комментарии. Затем вернитесь и задайте вопрос правильно. – symcbean

ответ

0

Если я понять Ваш запрос правильно, вам не нужно подзапрос, а outer joins:

select q.* 
from q_and_a q 
    left join question_keywords qk on q.id = kq.question_id 
    left join keywords k on k.id = gk.keyword_id 
where q.keyword = :keyword_top or 
    k.keyword = :keyword_bottom 

Вам может понадобиться использовать distinct с этим, зависит от данных образцов и желаемых результатов ,

Фактически, поскольку это действительно вопрос о производительности, это может ускорить или не ускорить его. Как обычно, это просто зависит.

Пара других вариантов вашего существующего запроса будет включать использование exists или использование union all вместо or. Вы должны выполнить сравнения, чтобы увидеть, что лучше всего работает в вашей ситуации. Также необходимо правильно определить ваши индексы и ключи.

0

Это могло бы быть чище для SQL-движка сделать это как левое соединение, а не делать подзапрос.

SELECT qa.* 
FROM q_and_a qa 
     LEFT JOIN question_keywords qk 
       ON qa.id = qk.question_id 
     LEFT JOIN keywords k 
       ON k.id = qk.keyword_id 
WHERE qa.keyword = :keyword_top 
     OR k.keyword = :keyword_bottom 
Смежные вопросы