SQLite中的子选择 问题

SQLite中的子选择 问题,sql,sqlite,subquery,Sql,Sqlite,Subquery,我最近正在完成一项技术测试,这要求我执行一个相当复杂的SQL查询,在收到任何反馈之前,我想知道我给出的答案是否正确,以及如何改进 以下是我对这个问题的解释: 假设我们有一个卖帽子的网站,我们想为它建立一个数据库。每种类型的帽子都有尺寸、价格等。每种类型的帽子也可以不分为一个或多个类别,这些类别本身可以是公共的或私人的 请执行以下操作: 编写伪SQL代码,创建对上述内容建模所需的表。 编写一个查询,返回至少属于5个公共类别的HAT类型的记录。 我的尝试 由于我的大部分经验都是使用SQLite的,所

我最近正在完成一项技术测试,这要求我执行一个相当复杂的SQL查询,在收到任何反馈之前,我想知道我给出的答案是否正确,以及如何改进

以下是我对这个问题的解释:

假设我们有一个卖帽子的网站,我们想为它建立一个数据库。每种类型的帽子都有尺寸、价格等。每种类型的帽子也可以不分为一个或多个类别,这些类别本身可以是公共的或私人的

请执行以下操作:

编写伪SQL代码,创建对上述内容建模所需的表。 编写一个查询,返回至少属于5个公共类别的HAT类型的记录。 我的尝试 由于我的大部分经验都是使用SQLite的,所以我从SQLite的角度来处理这个问题,并在我的回答中的一条评论中写下了这一点

关于上面的第1点,我创建了三个表:Hat、Category和BelongsToCategory,最后一个表是前两个的联接表。我公开了类别表的一列,整型:0表示false,1表示true

关于第2点,这是我的问题:

挑选* 从帽子 哪里 选择计数* 从属于这一类 在Category.code=BelongsToCategory.Category上加入类别 其中BelongsToCategory.hat=hat.code,Category.public=1 >= 5 测试我的尝试 我以以下方式测试了我的尝试:

我制作了自己的.db文件。 我使用SQLite的数据库浏览器打开了上述文件。 我创建了我的表,如上所述。 我将数据添加到这些表中,如下所示: 我在Hat表中添加了三条新记录:hat1、hat2和hat3。 我在Category表中添加了六条新记录:cat1到cat6,其中cat1到cat5是公共的,cat6是私有的。 我将记录添加到BelongsToCategory表中,这样hat1属于cat1到cat5的类别,hat2只属于cat1,hat3属于cat1到cat4的类别,也属于cat6。 我运行了上面的SQL代码。 当我运行上述SQL代码时,它返回了hat1的记录。工作完成了!别那么快。。。当我试着用它玩一玩,把5改成4,或者3,2等等,我一直保持着hat1的记录,别的什么都没有。只有当我到达1时,hat3才开始出现,而我从未见过hat2

这是怎么回事?我的问题有问题吗?或者这是SQLite浏览器中的一个bug

我想知道的是 上面的SQL查询正确吗? 如何改进?
我不相信你的查询有任何问题,我已经测试过了,它按照预期工作。因此,我相信您可能没有按预期插入数据

如果将count子查询作为附加列添加到主查询中,并使用>=0,则可以查看计数并查看计数情况

e、 g:-

SELECT *, (SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true)) AS cat_count
FROM Hat
WHERE
    (SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true))
    >= 0
;
以下内容用于测试上述内容:-

PRAGMA foreign_keys = ON;
DROP TABLE IF EXISTS BelongsToCategory;
DROP TABLE IF EXISTS Hat;
DROP TABLE IF EXISTS Category;
CREATE TABLE IF NOT EXISTS Hat (code INTEGER PRIMARY KEY, hattype TEXT, hatprice REAL, hatsize REAL, hatetc TEXT);
CREATE TABLE IF NOT EXISTS Category (code INTEGER PRIMARY KEY, category TEXT, public INTEGER);
CREATE TABLE IF NOT EXISTS BelongsToCategory (
    hat INTEGER REFERENCES Hat(code) ON DELETE CASCADE ON UPDATE CASCADE
    , category INTEGER REFERENCES Category(code) ON DELETE CASCADE ON UPDATE CASCADE
    , PRIMARY KEY(hat,category)
    )   
;

INSERT INTO Category VALUES(1,'cat1',true),(2,'cat2',true),(3,'cat3',true),(4,'cat4',true),(5,'cat5',true),(6,'cat6',false);
INSERT INTO Hat VALUES(1,'hat1',100,7,'other'),(2,'hat2',90,6,'other'),(3,'hat3',95,5,'other'),(4,'hat4',110,8,'other'),(5,'hat5',120,8,'other');
INSERT INTO BelongsToCategory VALUES
    (1,1),(1,2),(1,3),(1,4),(1,5),(1,6)
    ,(2,1)
    ,(3,1),(3,2),(3,3),(3,4)
    ,(5,6),(5,1)
;

SELECT *, (SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true)) AS cat_count
FROM Hat
WHERE
    (SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true))
    >= 0
;
以上使用>=0得出的结果:-

使用>=5:-

使用>=4:-


你能把这个问题一五一十地再现出来吗:请在示例数据中添加表结构。你的方法似乎合理,但总体问题似乎太宽泛,无法解决单堆栈溢出问题。