【发布时间】:2021-07-07 12:42:23
【问题描述】:
给定表:
+---+-------+------+---+
|id | attr | fker |did|
+---+-------+------+---+
|1 | attr1 | 5 | 1|
|2 | attr1 | 17 | 1|
|3 | attr1 | 3 | 2|
|4 | attr2 | 31 | 2|
|5 | attr2 | 7 | 2|
|6 | attr2 | 6 | 2|
|7 | attr3 | NULL | 1|
|8 | attr3 | NULL | 2|
|9 | attr3 | NULL | 1|
|10 | attr4 | NULL | 1|
|11 | attr4 | NULL | 1|
|12 | attr4 | NULL | 1|
+---+-------+------+---+
我需要一个 SQL 查询,该查询将列出所有且仅具有所有 fker=NULL 的属性 并且 他们的所有 did=1
在这个例子中,
- 只有 attr4 满足这个条件,因为
- attr1 没有 fker=NULL,
- attr2 没有它的所有 did=1(实际上没有),
- attr3 没有其所有的 fekr=NULL(即使有,它也有 =2)。
换句话说,查询的结果集中应该只有“attr4”。
在http://sqlfiddle.com 上使用以下示例:
CREATE TABLE IF NOT EXISTS `ha_example` (
`id` int(6) unsigned NOT NULL,
`attr` varchar(200) NOT NULL,
`fker` int null,
`did` int(3) unsigned NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `ha_example` (`id`, `attr`, `fker`, `did`) VALUES
('1', 'attr1', '5', '1'),
('2', 'attr1', '17', '1'),
('3', 'attr1', '3', '2'),
('4', 'attr2', '31', '2'),
('5', 'attr2', '7', '2'),
('6', 'attr2', '6', '2'),
('7', 'attr3', NULL, '1'),
('8', 'attr3', NULL, '2'),
('9', 'attr3', NULL, '1'),
('10', 'attr4', NULL, '1'),
('11', 'attr4', NULL, '1'),
('12', 'attr4', NULL, '1');
我尝试了这个 SQL(借助一个类似的问题 here -- 相似但不相同):
SELECT COUNT(fker), SUM(CASE WHEN did = 1 THEN 1 ELSE 0 END), attr, he.*
FROM ha_example he
group by attr,did
HAVING COUNT(fker) = SUM(CASE WHEN did = 1 THEN 1 ELSE 0 END)
但我无法计算出attr 的所有行的总数,除非放弃两个字段而不是一个字段。
我该如何做到这一点?
【问题讨论】: