繁体   English   中英

SQL Select 最大计数嵌套?

[英]SQL Select Max Count Nested?

SELECT N.National_PosID, N.Title, C.First_Name, C.Mid_Name, C.Last_Name, count(*)  
FROM National_Position N, Candidate C, Vote V
WHERE N.National_PosID = C.National_PosID AND V.Candidate_ID = C.Candidate_ID
Group by N.National_PosID, N.Title, C.First_Name, C.Mid_Name, C.Last_Name;

output

+------------+------------+----------+-----------+----------+
| Title      | First_Name | Mid_Name | Last_Name | count(*) |
+------------+------------+----------+-----------+----------+
| Agueda     | Sarahann   |          | MCMAHON   |      557 |
| Amesha     | Maurice    |          | GREEN     |     1071 |
| Kiante     | Jesicca    |          | WINTERS   |      482 |
| Kieffer    | Serene     |          | HIGGINS   |     1285 |
| Koray      | Ahley      |          | COLLIER   |     1287 |
| SENATE     | Daisy      | Hao      | MADDOX    |     1316 |
| SENATE     | Radhames   | Jakson   | MURILLO   |     1269 |
| SENATE     | Rayan      | Kaitlynn | FRYE      |     1089 |
| SENATE     | Rio        | Krysti   | HUGHES    |      457 |
| SENATE     | Shalondra  | Nila     | HORTON    |      551 |
+------------+------------+----------+-----------+----------+
10 rows in set (1.33 sec)

问题是我如何获得唯一最大计数的 output 。 仅输出最大票数行。 这是在 mysql 上运行的。

您可以使用subquery来获取原始结果的max count

SELECT t1.National_PosID, t1.Title, t1.First_Name, t1.Mid_Name, t1.Last_Name, max(ct)
FROM(
    SELECT N.National_PosID, N.Title, C.First_Name, C.Mid_Name, C.Last_Name, count(*) ct 
    FROM National_Position N
    INNER JOIN Candidate C ON N.National_PosID = C.National_PosID
    INNER JOIN Vote V ON V.Candidate_ID = C.Candidate_ID  
    INNER JOIN      
    GROUP BY N.National_PosID, N.Title, C.First_Name, C.Mid_Name, C.Last_Name) as t1
GROUP BY t1.National_PosID, t1.Title, t1.First_Name, t1.Mid_Name, t1.Last_Name

如果您使用的是 Oracle(显示查询结果的方式表明),那么您可以使用FETCH FIRST N ROWS ONLY语法来仅显示具有最大计数的记录。 此语法自 Oracle 12.1 起可用。

SELECT 
    N.National_PosID, 
    N.Title, 
    C.First_Name, 
    C.Mid_Name, 
    C.Last_Name, count(*) cnt
FROM 
    National_Position N
    INNER JOIN Candidate C ON N.National_PosID = C.National_PosID
    INNER JOIN Vote V ON V.Candidate_ID = C.Candidate_ID
GROUP BY 
    N.National_PosID, 
    N.Title, 
    C.First_Name, 
    C.Mid_Name, 
    C.Last_Name
ORDER BY cnt DESC
FETCH FIRST 1 ROWS ONLY;

在 Mysql(和 Postgres)中,只需将FETCH FIRST 1 ROWS ONLY替换为LIMIT 1

注意:隐式连接很久以前就已经失宠了。 始终使用显式连接。 我已相应地修改了您的查询。

SELECT *
FROM (
    SELECT 
        N.National_PosID, 
        N.Title, 
        C.First_Name, 
        C.Mid_Name, 
        C.Last_Name, count(*) cnt
    FROM 
        National_Position N
        INNER JOIN Candidate C ON N.National_PosID = C.National_PosID
        INNER JOIN Vote V ON V.Candidate_ID = C.Candidate_ID
    GROUP BY 
        N.National_PosID, 
        N.Title, 
        C.First_Name, 
        C.Mid_Name, 
        C.Last_Name
    ORDER BY cnt DESC
) x 
WHERE ROWNUM = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM