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 :(得分: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
。您必须运行比较以查看在您的情况下最有效的方法。您的索引和键也需要适当定义。
答案 1 :(得分: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