如何解决SQLite 中的子选择
问题
我最近完成了一项技术测试,这要求我执行一个相当复杂的sql 查询,我想在收到任何反馈之前知道答案是否符合我的要求给的是正确的,以及如何改进。
这是我对问题的释义:
假设我们有一个销售帽子的网站,我们想为其建立一个数据库。每种类型的帽子都有尺寸、价格等。每种类型的帽子也可以归为无、一个或多个类别,这些类别本身可以是公开的或私人的。
执行以下操作:
我的尝试
由于我的大部分经验是使用 sqlite,所以我从 sqlite 的角度解决了这个问题,并在我的回答的评论中写了这个。
关于上面的第 (1) 点,我创建了三个表:Hat
、Category
和 BelongsToCategory
,最后一个是前两个的连接表。我将 public
设为 Category
表的列,类型为 INTEGER
:0 表示假,1 表示真。
至于第 (2) 点,这是我的查询:
SELECT *
FROM Hat
WHERE
(SELECT COUNT(*)
FROM BelongsToCategory
JOIN Category ON Category.code = BelongsToCategory.category
WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = 1))
>= 5
测试我的尝试
我以下列方式测试了我的尝试:
当我运行上面的 sql 代码时,它返回了 hat1 的记录。任务完成!没那么快...当我尝试稍微玩弄它时,将 5 更改为 4,或 3、2 等,我一直获得 hat1 的记录,仅此而已。直到我到达 1 时,hat3 才开始弹出,而我从未见过 hat2。
这是怎么回事? 我的查询有问题吗?或者这是 sqlite 浏览器中的错误?
我想知道的
解决方法
我不认为您的查询有任何问题(我已经对其进行了测试并且它按预期工作)。因此,我相信您可能没有按预期插入数据。
如果您将计数子查询作为附加列添加到主查询并使用 >= 0,您可以查看计数并了解计数的情况
例如:-
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',(3,'cat3',(4,'cat4',(5,'cat5',(6,'cat6',false);
INSERT INTO Hat VALUES(1,'hat1',100,7,'other'),'hat2',90,6,'hat3',95,5,'hat4',110,8,'hat5',120,'other');
INSERT INTO BelongsToCategory VALUES
(1,1),(1,2),3),4),5),6),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):-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。