多次执行 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
             )