id在列表中时的SQL有效复杂过滤

时间:2019-02-24 05:14:09

标签: sql

对不起,我是SQL的新手,标题可能不太清楚,可能更容易通过示例进行解释。

我有一张桌子(见下文),其中包含一系列午餐的所有食物。

---------------------------
| id | lunch_id | food_id |
---------------------------
|  1 |       11 |      21 |
|  2 |       11 |      22 |
|  3 |       11 |      23 |
|  4 |       12 |      21 |
|  5 |       12 |      24 |
|  6 |       12 |      25 |
|  7 |       13 |      21 |
|  8 |       13 |      23 |
|  9 |       13 |      26 |

我要选择所有包含特定食品列表的lunch_id

例如我想要包含lunch_id 21 AND 23的所有food_id,在此示例中,结果为11和13。

我可以使用一系列SQL语句来做到这一点,但是我怀疑有更好的方法来实现它。

2 个答案:

答案 0 :(得分:4)

lunch_id分组,仅接受同时具有两者 food_id的那些分组。

select lunch_id
from your_table
where food_id in (21,23)
group by lunch_id
having count(distinct food_id) = 2

答案 1 :(得分:0)

您可以使用存在

   select t1.* from table_name t1
   where exists ( select 1 from table_name t2 where t1.lunch_id =t2.lunch_id 
                                        and t2.food_id in (21,23
                        having count(*)=2
                 )