2017-07-25 26 views
0

Ich habe eine Frage wie folgt:Falsche Ausgabe in MYSQL

Die Gesamtpunktzahl eines Hackers die Summe ihrer maximalen Werte für alle Herausforderungen ist. Schreiben Sie eine Abfrage, um den hacker_id, den Namen und die Gesamtpunktzahl der nach absteigender Punktzahl geordneten Hacker zu drucken.
Wenn mehr als ein Hacker die gleiche Gesamtpunktzahl erreicht hat, sortieren Sie das Ergebnis aufsteigend nach hacker_id.
Schließen Sie alle Hacker mit einer Gesamtpunktzahl von 0 von Ihrem Ergebnis aus.
Die zwei Tabellen sind wie folgt gegeben:

Tabelle: Hacker

======================================== 
hacker_id: Integer (ID of the hacker) 
name: String (Name of the hacker) 
======================================== 

Tabelle: Submissions

=================================================== 
submission_id: Integer (ID of the submission) 
hacker_id:  Integer (ID of the hacker) 
challenge_id: Integer (ID of the challenge) 
score:   Integer (score of the submission) 
=================================================== 

Die MYSQL Abfrage Ich habe wird wie folgt geschrieben: -

select 
    a.hacker_id, 
    a.name, 
    a.total 
from(
    select 
     h.hacker_id, 
     h.name, 
     sum(case when s.hacker_id=h.hacker_id then s.score else 0 end) as total 
    from 
     hackers h, 
     submissions s 
    group by 
     h.hacker_id, 
     h.name 
) as a 
where 
    a.total>0 
order by 
    a.total desc, 
    a.hacker_id asc; 

ich für diese falschen Ausgang bin immer aber, dass Ausgabe erfüllt alle Regeln der Ordnung & ommission von 0 scorers nach Bedarf. Ich bin sehr verwirrt, was der Fehler ist. Jemand bitte helfen !!!

+0

Zunächst einmal die richtige Verbindung verwenden. Sie benötigen kein kartesisches Produkt der beiden Tabellen. – Eric

Antwort

0

Die Gesamtpunktzahl eines Hackers ist die Summe von ihre maximal Noten für alle Herausforderungen.

Zuerst müssen Sie das Maximum finden, ein Hacker ein Tor für jede Herausforderung:

SELECT hacker_id 
    , challenge_id 
    , MAX(score) AS max_score 
    FROM Submissions 
GROUP BY hacker_id 
     , challenge_id 

Dann müssen Sie Summe, die für jeden Hacker:

SELECT hacker_id 
    , SUM(max_score) AS total_score 
    FROM (SELECT hacker_id 
       , challenge_id 
       , MAX(score) AS max_score 
      FROM Submissions 
      GROUP BY hacker_id 
       , challenge_id 
     ) ms 
GROUP BY hacker_id 

Schließlich gelten Sie die Rest:

Alle Hacker mit einem total score von 0 ausschliessen von deinem Ergebnis.

Drucken Sie die hacker_id, name und total score

Sortiert nach dem absteigenden score, dann durch hacker_id aufsteigend.

SELECT hacker_id 
    , (SELECT name 
      FROM Hackers h 
      WHERE h.hacker_id = ms.hacker_id 
     ) AS name 
    , SUM(max_score) AS total_score 
    FROM (SELECT hacker_id 
       , challenge_id 
       , MAX(score) AS max_score 
      FROM Submissions 
      GROUP BY hacker_id 
       , challenge_id 
     ) ms 
GROUP BY hacker_id 
HAVING SUM(max_score) <> 0 
ORDER BY total_score DESC 
     , hacker_id 
+0

ausgezeichnete Erklärung! – Priya

1

Etwas wie:

select h.hacker_id, h.name, sum(s.score) as total 
from hackers h 
join submissions s using (hacker_id) 
group by h.hacker_id 
order by sum(s.score) desc, h.name 
having sum(s.score) > 0 

Die Grundidee besteht darin, dass mit beginnen wir Hacker und Einreichungen Tabellen miteinander zu verbinden, und dann die Partitur zu summieren und die Gruppe durch Klausel verwenden, um eine neue Summe für jeden Hacker zu bekommen. Fügen Sie dann die Reihenfolge hinzu. Dann ist das HAVING schließlich, was jeden herausfiltert, der eine Nullbewertung hat.

Ich habe nicht Ihre Daten zum Testen mit, aber hoffentlich ist dies nah genug, dass es Ihnen auf dem Weg hilft!

+0

Sie verpassen den "maximalen" Teil: * "Gesamtpunktzahl eines Hackers ist die Summe ihrer ** maximalen ** Punktzahl" *. Sie fassen die mehrfache Einreichung derselben Herausforderung zusammen, und das ist nicht richtig. --- Mit dieser 'Gruppe nach 'können Sie' h.name' als Ergebnisspalte haben. --- Sekundäre Sortierung ist nicht 'h.name'. --- Folge von Klauseln ist falsch (kann nicht 'haben' nach 'order by') haben. – Andreas

+0

Ah, hat es nicht geschafft, von der ursprünglichen Frage Version zu analysieren, dass Hacker mehr als einmal einreichen konnten, gute Stelle –