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 |
我正在寻找一种解决方案,使我能够避免循环检查每条记录是否所有子记录都符合要求的条件。
使用其他 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 |