示例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语句更好的方法。我还没有把这个想出来,我真的不喜欢这种方法,因为它看起来并不那么高效。
答案 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
)