SQL выбрать максимальное количество вложенных? - PullRequest
0 голосов
/ 22 октября 2019
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;

Выход

+------------+------------+----------+-----------+----------+
| 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)

Проблема в том, как мне получить выход только из максимального числа. Только вывод строки максимального количества голосов. Это работает на MySQL.

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Если вы используете 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
0 голосов
/ 22 октября 2019

вы можете использовать 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
...