如何在 MySQL 中执行 IS_THE_SUBSET_OF 函数?
Posted
技术标签:
【中文标题】如何在 MySQL 中执行 IS_THE_SUBSET_OF 函数?【英文标题】:How to perform IS_THE_SUBSET_OF function in MySQL? 【发布时间】:2018-04-16 11:23:10 【问题描述】:添加:学生和需要的 CREATE 代码
CREATE TABLE `student` (
`sid` VARCHAR(6) NOT NULL,
`sname` VARCHAR(6) NULL DEFAULT NULL,
`sex` VARCHAR(2) NULL DEFAULT NULL,
`age` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
`dept` VARCHAR(50) NULL DEFAULT NULL,
`class` VARCHAR(4) NULL DEFAULT NULL,
PRIMARY KEY (`sid`)
);
CREATE TABLE `takes` (
`sid` VARCHAR(6) NOT NULL,
`cid` VARCHAR(3) NOT NULL,
`score` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`sid`, `cid`)
)
我将显示所有参加过 ID 为“31401”的学生所修课程的学生的 ID 和姓名。我有以下代码:
SELECT sid, sname
FROM student S
WHERE NOT EXISTS((SELECT cid
FROM takes
WHERE sid = '31401')
EXCEPT
(SELECT cid
FROM takes T
WHERE S.sid = T.sid));
但是,mysql 中没有 EXCEPT 操作。所以我想知道我是否可以这样重写:
SELECT sid, sname
FROM student S
WHERE ((SELECT cid
FROM takes
WHERE sid = '31401')
IS_THE_SUBSET_OF
(SELECT cid
FROM takes T
WHERE S.sid = T.sid));
如何实现 IS_THE_SUBSET_OF 函数?
【问题讨论】:
您可以使用 HAVING、IS、IS NOT、IS NOT IN() 等,或者您可以只使用连接来做您想做的事情,而不是保存子查询并更快。 Error when using except in a query的可能重复 【参考方案1】:没有基于集合的运算符可以满足您的需求。可以使用join
、group by
等一些逻辑:
select t.sid
from takes t join
takes ts
on t.cid = ts.cid and ts.sid = 31401 -- don't use single quotes for a numeric constant
group by t.sid
having count(*) = (select count(*) from takes ts2 where ts2.sid = 31401);
此公式假设 takes
没有重复的 sid
/cid
对。
【讨论】:
以上是关于如何在 MySQL 中执行 IS_THE_SUBSET_OF 函数?的主要内容,如果未能解决你的问题,请参考以下文章