SQL查询子句的顺序

时间:2017-11-29 11:47:48

标签: mysql sql

我遇到了一个我似乎无法得到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的咖啡。

2 个答案:

答案 0 :(得分:0)

表达式(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
                   );

还有其他方法可以编写此查询。但是,这应该可以帮助您理解为什么您的版本不能按照您的要求执行操作。

答案 1 :(得分:0)

你可以这样做

DECLARE @likes AS TABLE(CName NVARCHAR(50), UName NVARCHAR(50), 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  UName, COUNT(CName) Cnt FROM @Likes
WHERE Rating = (SELECT MAX(Rating) FROM @Likes)
GROUP BY UNAME

DEMO