Sqlite3子查询,其中子查询中的所有记录都为真

Sqlite3 Subquery where ALL records in subquery are true

我正在寻找一种解决方案,使我能够避免循环检查每条记录是否所有子记录都符合要求的条件。

使用其他 SQL 语言,我可以使用 ALL 查询,但 sqlite 不支持 "where field = ALL ( select subquery )" 语法。

我有 3 个 table。一,食谱清单。二,食谱配料表。三,一个 table 用户将打开和关闭值以 select 正确的食谱。

我需要显示包含 "ALL" 用户勾选成分的所有食谱。

因此,如果用户 select 和 "green pepers" 以及 "chicken",则只会显示同时包含两者的食谱。

Table 1: Recipes
recipe_id   int
recipe_name text

Table 2: Ingredients
recipe_header     int ( link to header)
recipe_ingredient text

Table 3: User selection ( this table will be modified on the fly to represent only ingredients that are included in recipes as different ingredients are checked off)
recipe_ingredient   text
user_selected       text (true/false)

Table 1:
t1_id       t1_name
---------   ---------------
1       Chicken Marsala
2       Chicken Parmesan
3       Flank Steak
4       Grilled Salmon

Table 2:
t2_link     t2_ingredient
-------     -------------
1       chicken
1       green peppers
1       olive oil
2       chicken
2       olive oil
2       peeled tomatoes
3       flank steak
3       olive oil
3       soy sauce
3       pepper
4       salmon fillet
4       soy sauce
4       pepper

Table 3:
t3_ingredient       t3_checked
-------------       ----------
chicken         ( true or false )
flank steak     ( true or false )
green peppers       ( true or false )
olive oil       ( true or false )
peeled tomatoes     ( true or false )
pepper          ( true or false )
salmon fillet       ( true or false )
soy sauce       ( true or false )

如果用户select具有以下成分(真) "chicken"、"olive oil"

-- 将显示马萨拉鸡肉和帕尔马干酪鸡肉。

如果用户 selects "soy sauce" 和 "pepper"

-- 将显示 Flank Stean & Grilled Salmon。

如果用户 selects "olive oil"

-- 将显示 Chicken Marsala、Chicken Parmesan 和 Flank Steak。

this SQL Fiddle:

中演示的其中一种方法
select * from Table1
where t1_id IN (
  SELECT t2_link 
  FROM Table2 INNER JOIN Table3 ON 
    t2_ingredient = t3_ingredient AND t3_checked = 'true'
  GROUP BY t2_link
  HAVING COUNT(DISTINCT t2_ingredient) = (
    SELECT COUNT(t3_ingredient) FROM Table3 WHERE t3_checked = 'true'
    )
)

"chicken"、"olive oil"

的结果
| t1_id |          t1_name |
|-------|------------------|
|     1 |  Chicken Marsala |
|     2 | Chicken Parmesan |