多次执行 mysql "in" 的最佳方法
Best way to do a mysql "in" multiple times
示例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 语句更好的方法。我还没弄清楚这个,我不太喜欢这种方法,因为它看起来效率不高。
或者,您可以尝试提前加入:
SELECT * FROM listings
JOIN listings_x ON listings_x = listings.type
WHERE listings_x.id BETWEEN 1 AND 3;
ON
关键字后面的是连接条件。通过将连接条件移动到 from 子句,不必重复连接,提高效率并减少输入量。
连接条件与您在 where 子句中使用的条件相同;它只是被移到了 from 子句中。
您想要全部三种类型的列表。
假设有一个listings id,那么下面会为您提供所有三个的listings ids:
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
)
示例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 语句更好的方法。我还没弄清楚这个,我不太喜欢这种方法,因为它看起来效率不高。
或者,您可以尝试提前加入:
SELECT * FROM listings
JOIN listings_x ON listings_x = listings.type
WHERE listings_x.id BETWEEN 1 AND 3;
ON
关键字后面的是连接条件。通过将连接条件移动到 from 子句,不必重复连接,提高效率并减少输入量。
连接条件与您在 where 子句中使用的条件相同;它只是被移到了 from 子句中。
您想要全部三种类型的列表。
假设有一个listings id,那么下面会为您提供所有三个的listings ids:
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
)