最好的方法来做一个mysql" in"多次

时间:2015-02-07 21:04:39

标签: mysql sql performance optimization

示例mysql

SELECT * FROM listings WHERE (
1 IN (SELECT id FROM listings_x WHERE listings_x.type = listings.type) AND
2 IN (SELECT id FROM listings_x WHERE listings_x.type = listings.type) AND
3 IN (SELECT id FROM listings_x WHERE listings_x.type = listings.type) AND
)

是否有比多次执行相同select语句更好的方法。我还没有把这个想出来,我真的不喜欢这种方法,因为它看起来并不那么高效。

2 个答案:

答案 0 :(得分:2)

或者,您可以提前尝试加入:

SELECT * FROM listings
JOIN listings_x ON listings_x = listings.type
WHERE listings_x.id BETWEEN 1 AND 3;

ON关键字之后出现的是连接条件。通过将连接条件移动到from子句,不必重复连接,从而提高效率并减少键入量。

连接条件与您在where子句中使用的条件相同;它只被移到了from子句。

答案 1 :(得分:1)

您希望列表中的所有三种类型。

假设有一个列表ID,那么以下内容将为您提供所有三个列表ID:

select l.id
from listings l join
     listings_x lx
     on lx.type = l.type
where lx.id in (1, 2, 3)
group by l.id
having count(distinct lx.id) = 3;

您可以利用MySQL(错误)功能,该功能允许select中的列不在group by中,因为您通过唯一键进行聚合。所以:

select l.*
from listings l join
     listings_x lx
     on lx.type = l.type
where lx.id in (1, 2, 3)
group by l.id
having count(distinct lx.id) = 3;

编辑:

如果你想用你所拥有的相同结构(使用where子句而不是group by)来做这件事,你可以这样做:

SELECT l.*
FROM listings l
WHERE EXISTS (SELECT 1
              FROM listings_x x
              WHERE x.type = l.type and x.id in (1, 2, 3)
              HAVING COUNT(DISTINCT x.id) = 3
             )