使用 SQL 查询多对多关系表,根据多个条件筛选结果

前两天我在果菜市场闲逛,看到一位阿姨在买鸡蛋和牛奶。
他兴奋地跑回家准备煎蛋和牛奶,但他很着急,因为他的调味品已经用完了。
现在,如果有一个食谱应用程序可以直接找到使用这两种食材的菜肴,那就太好了。

例如,昨天我尝试了这个 SQL 语句,并在超市收银台旁边的小计算机上输入: SELECTr.id,r.nameFROMreciperJOINrecipe_ingredientriONr.id=ri.ridJOINingredient iONi.id=ri.iidWHEREi.nameIN('鸡蛋','牛奶')GROUPBYr.id,r.nameHAVINGCOUNT(DISTINCTi.id)=2 ;当时系统显示了三道菜:西红柿炒鸡蛋、牛奶炖鸡蛋、牛奶炒鸡蛋。
但突然我发现一个问题,如果阿姨也买了面粉怎么办?也许我们需要添加另一个条件。

等等,还有一件事,我注意到电脑屏幕很亮,并且反射与我昨天从图书馆借的书不同。
我突然想到,这种查询其实可以用Excel来完成,但是你需要先整理一下配料表和菜谱表。
例如,我在咖啡馆的记事本上画了一个这样的表格:
食谱ID |菜名|成分 ID |成分名称 -------|----------|--------|-------- 1 |番茄炒鸡蛋 | 1 01 |番茄 1 |番茄炒鸡蛋| 1 02 |鸡蛋 2 |牛奶炖鸡蛋| 1 03 |牛奶 2 |牛奶炖鸡蛋| 1 02 |鸡蛋 ... | ... | ... | ...
然后过滤成分名称为“鸡蛋”和“牛奶”的行,最后计算每个食谱包含多少种不同的成分。
不过,这种方法似乎只适用于菜谱很少的情况。
如果您确实想构建一个菜谱应用程序,您可能需要使用数据库。

sql中有多个条件时,只要满足其中一个条件的全都显示出来

嘿,我有点明白你在说什么了。
之前做这个SQL的时候,确实很混乱。

我记得去年在杭州,我们的项目中有一个需求。
我们必须从用户列表中选择一些特别关注的用户。
必须要用IN,不然条件太多,写起来也太复杂了。
那时该表称为用户。
为了检查 id 为 1 001 、1 002 和 1 003 的用户,我直接使用 select from users where id is in (1 001 , 1 002 , 1 003 )。
事情发生得很快,结果也还可以,这已经是相当不错了。

还有一次,在苏州,我们要找名字里带“小”或“强”的员工,这些员工就叫员工。
一开始想用IN,但是发现名字是字符串,不能直接使用,于是想了想,只能用like。
我写下了一些名字像“%小%”或者姓氏像“%强%”的员工,然后发现了。
不过后来发现这样写效率有点低,后来就改用全文索引了。

所以你看,如果IN和LIKE用在正确的地方,问题就会解决。
不过,使用哪一种还要根据情况而定。