MYSQL过滤器乘以两个id列表

时间:2016-05-13 15:04:25

标签: mysql where

我有结果:

item_id     subitem_id
----------------------
1           35
1           25
1           8
2           10
2           25
3           60
4           35
4           25
4           44
5           1
5           23
5           15
5           13
5           9

我有两个subitem列表

(25,44,1)
(8,9)

如何设置where子句以过滤结果并返回此

item_id     subitem_id
----------------------
1           35
1           25   <-- first set
1           8    <-- second set
-----------------
5           1    <-- first set
5           23
5           15
5           13
5           9    <-- second set

因为此item_id包含两个列表中的subitem_id

SELECT 
    `item_id`
FROM table
WHERE `subitem_id` in (25,44,1)
AND `subitem_id` in (8,9)

没有用,因为在一次subitem_id有一个id(不是所有列表)

P.S。 这是一个简单的例子,实际上我们有超过100k的记录和一些连接构造

2 个答案:

答案 0 :(得分:1)

http://sqlfiddle.com/#!9/71c28e5/3

SELECT t1.*
FROM (
SELECT DISTINCT(t1.item_id)
FROM t1
INNER JOIN t1 t2
ON t1.item_id = t2.item_id
  AND t2.subitem_id in (8,9)
WHERE t1.subitem_id in (25,44,1)
  ) t
LEFT JOIN t1
ON t.item_id = t1.item_id

Another approach to avoid big number of executed records for mysql:

http://sqlfiddle.com/#!9/71c28e5/10

SELECT t1.*
FROM t1
WHERE item_id in (
SELECT DISTINCT(t1.item_id)
FROM t1
INNER JOIN t1 t2
ON t1.item_id = t2.item_id
  AND t2.subitem_id in (25,44,1)
WHERE t1.subitem_id in (8,9)
  )

答案 1 :(得分:0)

SQL Fiddle

我认为您正在尝试确保item_ID在2个不同的集合中具有子类别..

Select * from table A
where exists (Select 1 from table B where A.Item_Id = B.Item_ID and subitem_ID in (25,44,1))
  and exists (Select 1 from table C where A.Item_Id = C.Item_ID and subitem_ID in (8,9))