Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 如何从嵌套select中指定至少有x个值的where子句_Sqlite_Relational Division - Fatal编程技术网

Sqlite 如何从嵌套select中指定至少有x个值的where子句

Sqlite 如何从嵌套select中指定至少有x个值的where子句,sqlite,relational-division,Sqlite,Relational Division,假设我有这些表: 人 最喜欢的食物 我想得到一份名单,列出至少喜欢第五个人喜欢的食物的人的名字。如下所示: SELECT p.name FROM person p LEFT JOIN favourite_food ff ON ff.personid = p.id WHERE ff.food = (SELECT food FROM favourite_food WHERE personid = 5) AND ff.personid <> 5; 但我不知道如何指定“至少”部分。我必须创

假设我有这些表:

最喜欢的食物

我想得到一份名单,列出至少喜欢第五个人喜欢的食物的人的名字。如下所示:

SELECT p.name FROM person p
LEFT JOIN favourite_food ff ON ff.personid = p.id
WHERE ff.food = (SELECT food FROM favourite_food WHERE personid = 5)
AND ff.personid <> 5;

但我不知道如何指定“至少”部分。我必须创建一个临时表吗?

SQL基本上是与集合一起工作的,因此它通常有助于严格按照集合论重新构造问题

至少可以这样重新制定: 如果我们只看第五个人最喜欢的食物,哪些人的最喜欢食物的数量与第五个人相同

SELECT name
FROM person
WHERE id IN (SELECT personid
             FROM favourite_food
             WHERE food IN (SELECT food
                            FROM favourite_food
                            WHERE personid = 5)
             GROUP BY personid
             HAVING COUNT(food) = (SELECT COUNT(food)
                                   FROM favourite_food
                                   WHERE personid = 5)
            )
或者,使用以下重新表述: 我们不想要那些不喜欢第五个人喜欢的食物的人。 因此,找出不存在第5人喜欢但该人不喜欢的食物的所有人:

SELECT name
FROM person
WHERE NOT EXISTS (SELECT 1
                  FROM favourite_food AS person5_food
                  WHERE personid = 5
                    AND NOT EXISTS (SELECT 1
                                    FROM favourite_food
                                    WHERE personid = person.id
                                      AND food = person5_food.food)
                 )
实际上,SQL是基于的,您需要的操作称为除法

SELECT name
FROM person
WHERE id IN (SELECT personid
             FROM favourite_food
             WHERE food IN (SELECT food
                            FROM favourite_food
                            WHERE personid = 5)
             GROUP BY personid
             HAVING COUNT(food) = (SELECT COUNT(food)
                                   FROM favourite_food
                                   WHERE personid = 5)
            )
SELECT name
FROM person
WHERE NOT EXISTS (SELECT 1
                  FROM favourite_food AS person5_food
                  WHERE personid = 5
                    AND NOT EXISTS (SELECT 1
                                    FROM favourite_food
                                    WHERE personid = person.id
                                      AND food = person5_food.food)
                 )