2016-08-24 3 views
4

Schreiben Sie eine Abfrage, um die hacker_id, den Namen und die Gesamtzahl der von jedem Schüler erstellten Herausforderungen auszudrucken. Sortieren Sie Ihre Ergebnisse nach der Gesamtanzahl der Abfragen in absteigender Reihenfolge. Wenn mehr als ein Student die gleiche Anzahl von Challenges erstellt hat, dann sortiere das Ergebnis nach hacker_id. Wenn mehr als ein Student die gleiche Anzahl von Challenges erstellt hat und die Anzahl weniger als die maximale Anzahl an erstellten Challenges ist, schließen Sie diese Teilnehmer vom Ergebnis aus.Ergebnisse auf Basis von Testfällen ausschließen

hacker_id name 
    5077 Rose 
    21283 Angela 
    62743 Frank 
    88255 Patrick 
    96196 Lisa 

Tabelle Herausforderungen:

Ich habe auch die Bilder für die jeweiligen Tabellen

Tabelle Hacker befestigt diese

challenge_id hacker_id 
     61654  5077 
     58302  21283 
     40587  88255 
     29477  5077 
     1220  21283 
     69514  21283 
     46561  62743 
     58077  62743 
     18483  88255 
     76766  21283 
     52382  5077 
     74467  21283 
     33625  96196 
     26053  88255 
     42665  62743 
     12859  62743 
     70094  21283 
     34599  88255 
     54680  88255 
     61881  5077 

So weit ich getan habe

SELECT c.hacker_id, h.name, COUNT(c.challenge_id) AS challenge_count 
FROM Challenges c LEFT JOIN Hackers h on c.hacker_id = h.hacker_id 
GROUP by 1,c.hacker_id HAVING challenge_count >= 
MAX(challenge_count) ORDER BY challenge_count DESC ,c.hacker_id DESC; 

Aber nicht erwartete Ausgabe. Mein Ausgangs

enter image description here

ich doppelte Ergebnisse vom Ausgang wie Hacker mit der gleichen Anzahl von Herausforderungen sollten ausgeschlossen werden, ausschließen müssen.

+0

Also .. Wer sollte hier ausgeschlossen werden? – sagi

+0

Hacker mit der gleichen Anzahl von Herausforderungen sollten ausgeschlossen werden, wenn der Wert für die Anzahl der Aufgaben kleiner ist als der Maximalwert. Wenn zwei Hacker die gleiche Anzahl von Herausforderungen haben und es der maximale Wert ist, müssen beide Hacker mit einbezogen werden. –

+0

@sagi Zumindest ist er konsistent :-) –

Antwort

3

Es gibt mehrere Kriterien hier:

  1. hacker_id, den Namen und die Gesamtzahl der Herausforderungen, die jeden Schüler erstellt
  2. sortieren Sie Ihre Ergebnisse durch die Gesamtzahl der Herausforderungen in absteigender Reihenfolge.
  3. Wenn mehr als ein Student die gleiche Anzahl an Challenges erstellt hat, sortieren Sie das Ergebnis nach hacker_id.
  4. Wenn mehr als ein Schüler die gleiche Anzahl an Aufgaben erstellt hat, dann schließen Sie diese Schüler aus dem Ergebnis aus.
  5. Außer wenn die Zählung geschaffen, um die maximale Anzahl von Herausforderungen entspricht,

Die folgenden Angebote mit Artikel 1,2, & 3 ...

SELECT h.* 
    , COUNT(c.challenge_id) challenge_count 
    FROM hackers h 
    JOIN challenges c 
    ON c.hacker_id = h.hacker_id 
GROUP 
    BY h.hacker_id 
ORDER 
    BY challenge_count DESC, hacker_id; 

Wir diese Abfrage selbst kommen kann, wenn , um die Kriterien 4 zu lösen, und um den Punkt 5 wieder aufzulösen, wie folgt:

SELECT DISTINCT a.* 
      FROM 
       (SELECT h.* 
        , COUNT(c.challenge_id) challenge_count 
        FROM hackers h 
        JOIN challenges c 
        ON c.hacker_id = h.hacker_id 
       GROUP 
        BY h.hacker_id 
      ) a 
      LEFT 
      JOIN 
       (SELECT h.* 
        , COUNT(c.challenge_id) challenge_count 
        FROM hackers h 
        JOIN challenges c 
        ON c.hacker_id = h.hacker_id 
       GROUP 
        BY h.hacker_id 
      ) b 
      ON b.hacker_id <> a.hacker_id AND b.challenge_count = a.challenge_count 
      LEFT 
      JOIN 
       (SELECT h.* 
        , COUNT(c.challenge_id) challenge_count 
        FROM hackers h 
        JOIN challenges c 
        ON c.hacker_id = h.hacker_id 
       GROUP 
        BY h.hacker_id 
      ) c 
      ON c.challenge_count > a.challenge_count 
      WHERE b.hacker_id IS NULL 
      OR c.hacker_id IS NULL 
      ORDER 
      BY challenge_count DESC, hacker_id; 
+0

Super Awesome ... vielen Dank –

+0

gute Antwort –

2
SELECT t1.name, 
     t1.hacker_id, 
     COALESCE(t2.challengeCount, 0) AS challengeCount 
FROM Hackers t1 
LEFT JOIN 
(
    SELECT hacker_id, COUNT(*) AS challengeCount 
    FROM Challenges 
    GROUP BY hacker_id 
) t2 
    ON t1.hacker_id = t2.hacker_id 
WHERE COALESCE(t2.challengeCount, 0) IN 
(
    SELECT t1.challengeCount 
    FROM 
    (
     SELECT t1.hacker_id, 
       COALESCE(t2.challengeCount, 0) AS challengeCount 
     FROM Hackers t1 
     LEFT JOIN 
     (
      SELECT hacker_id, COUNT(*) AS challengeCount 
      FROM Challenges 
      GROUP BY hacker_id 
     ) t2 
      ON t1.hacker_id = t2.hacker_id 
    ) t1 
    GROUP BY t1.challengeCount 
    HAVING COUNT(*) = 1 
) OR COALESCE(t2.challengeCount, 0) = 
(
    SELECT MAX(t.challengeCount) FROM 
    (
     SELECT COUNT(*) AS challengeCount 
     FROM Challenges GROUP BY hacker_id 
    ) t 
) 
ORDER BY COALESCE(t2.challengeCount, 0) DESC, 
     t1.hacker_id 
+0

was ist t2 hier ?? Tabellenherausforderungen ?? –

+1

't2' ist nur eine Tabelle _alias_. –

+0

Ich habe versucht, Ihre Abfrage auszuführen, aber es zeigt nur Hacker mit maximaler Anzahl von Herausforderungen –

Verwandte Themen