【问题标题】:SQL Query to find a group of rows having all of them a certain value in one of its fieldsSQL 查询以查找一组行,它们的一个字段中的所有行都具有特定值
【发布时间】: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 的所有行的总数,除非放弃两个字段而不是一个字段。

我该如何做到这一点?

【问题讨论】:

    标签: mysql sql group-by


    【解决方案1】:

    您可以使用group byhaving

    select attr
    from ha_example he
    gropu by attr
    having count(fker) = 0 and max(did) = min(did) and max(did) = 1;
    

    你也可以使用:

    having sum( fker is not null or did <> 1 ) = 0
    

    或者如果您愿意:

    having sum( not (fker is null and did = 1) ) = 0
    

    【讨论】:

    • 这太棒了。我不会想到像你那样使用 max()。
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多