SQL 查询子句的顺序

罗宾·S。

我遇到了一种情况,我似乎不明白 SQL 正在做什么。我有下表,想分发所有评分最高的咖啡种类= 5 和数量本身。

create table likes
(
     CName varchar(30),
     UName varchar(30),
     Rating int
);

insert into likes (CName, UName, Rating) 
values ('Java', 'Klaus', '5'),
       ('Super', 'Klaus', '5'),
       ('MP', 'Klaus', '3'),
       ('Java', 'Marc', '5'),
       ('Mp', 'Marc', '5'),
       ('Super', 'Marc', '2'),
       ('Java', 'Nine', '2'),
       ('Super', 'Nine', '0'),
       ('MP', 'Karo', '3'),
       ('Super', 'Fabian', '4');

但是,此解决方案无法按预期工作

SELECT 
    favcof.CName, favcof.cnt
FROM 
   (SELECT l.CName, COUNT(CName) cnt
    FROM likes l
    WHERE l.rating = 5
    GROUP BY CName) favcof
WHERE 
    favcof.cnt = (SELECT MAX(favcof.cnt))

它的执行就像没有外部 where 子句一样,并给出各种评分为 5 的咖啡。

戈登·利诺夫

表达式(select max(favcof.cnt))没有任何作用。你可以放下select,你会得到favcof.cnt = favcof.cnt

这有点复杂,因为favcof.cnt = max(favcof.cnt)会产生语法错误,因为where子句中不允许使用聚合函数因此,select子查询实际上是一个没有from. 因为只有一个值,所以它返回那个值。

你想要一个相关的子查询。这看起来像:

SELECT favcof.CName, favcof.cnt
FROM (SELECT l.UName, count(UName) as cnt
      FROM likes l
      WHERE l.rating=5
      GROUP BY UName
     ) favcof
WHERE favcof.cnt = (SELECT MAX(favcof2.cnt)
                    FROM (SELECT l2.UName, count(l2.UName) as cnt
                          FROM likes l2
                          WHERE l2.rating=5
                          GROUP BY l2.UName
                         ) favcof2
                   );

肯定有其他方法可以编写此查询。但是,这应该可以帮助您了解为什么您的版本没有按照您的意愿运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章