2009-06-11 9 views
0

mir jemand mit dieser Abfrage helfen:Distinct Beliebte Hits

SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS count 
FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
GROUP BY h.subid 
ORDER BY count DESC LIMIT 15 

RÜCKKEHR:

name   imdb   id owner count 
*Angels and Demons WTV /title/tt0808151/ 3337 3055 120 
Terminator Salvation 2009 /title/tt0438488/ 3539 26 120 
Friday The 13th-WTV  /title/tt0758746/ 3334 26 82 
Night at the Museum  /title/tt1078912/ 3548 7170 75 
*Angels and Demons WTV2 /title/tt0808151/  3512 12 10 

* KOPIERT IMDB

Wie Sie es zurück Ergebnisse mit dem gleichen imdb sehen. Was ich tun möchte, ist die höchste Anzahl zu erhalten, aber die niedrigste imdb Anzahl von dem Ergebnis auszuschließen.

Antwort

0

Was ich an MySQL im Vergleich zu Oracle mag, ist, wie andere Felder, die nicht Teil von GROUP BY sind, ausgewählt werden können, ohne Gruppierungsfunktionen zu verwenden. Die folgende Abfrage nimmt Ihre Abfrage und gruppiert sie nach imdb, die eine eindeutige imdb mit der höchsten Zählung auswählt (die zuerst in der absteigenden Sortierung im subselect erscheinen würde). Probieren Sie es aus und sehen Sie, ob es für Sie funktioniert.

+0

Mit ein paar Verbesserungen habe ich das funktioniert. Vielen Dank. Und danke an alle anderen :) –

0

Versuchen Sie folgendes:

SELECT su.name 
     , su.imdb 
     , su.id 
     , su.owner 
     , (SELECT COUNT(*) FROM dbo.subhits AS h WHERE h.subid = su.id) AS count 
    FROM dbo.subtitles AS su 
    ORDER BY count DESC LIMIT 15 

Edit: Mit Hilfe der zusätzlichen Informationen ich eine fast Arbeitslösung hatte aber blieb stecken. Ich habe die Antwort von Chris Simpson mit der Teillösung kombiniert. Es vermeidet temporäre Tabellen und hat die fehlenden Teile, für die der andere Chris keine Zeit hatte. Ich baue das in MSSQL, also muss es möglicherweise optimiert werden, um in MySQL zu arbeiten. Ich kann auch nicht garantieren, dass die Informationen ohne Ihre Daten korrekt sind, aber dies könnte helfen.

SELECT a.id 
     , (SELECT su.name FROM dbo.subtitles su WHERE a.id = su.id LIMIT 1) 
     , a.imdb 
     , (SELECT su.owner FROM dbo.subtitles su WHERE a.id = su.id LIMIT 1) 
     , a.count 
    FROM 
     (
      SELECT su.id 
        , su.imdb 
        , COUNT(*) AS count 
       FROM dbo.subtitles su 
       INNER JOIN dbo.subhits sh ON su.id = sh.subid 
       GROUP BY su.id, su.imdb 
     ) a 
    INNER JOIN 
     (
      SELECT c.imdb 
        , MAX(c.count) AS maxCount 
       FROM 
        (
         SELECT su.id 
           , su.imdb 
           , COUNT(*) AS count 
          FROM dbo.subtitles su 
          INNER JOIN dbo.subhits sh ON su.id = sh.subid 
          GROUP BY su.id, su.imdb 
        ) c 
       GROUP BY c.imdb 
     ) b ON a.imdb = b.imdb AND a.count = b.maxCount 
    ORDER BY a.count DESC LIMIT 15 
+0

Das ist, was meine Abfrage tut, aber es gibt doppelte 'su.imdb' zurück, und ich will das nicht passieren. Vielen Dank trotzdem –

+0

Können Sie die Frage mit einer detaillierteren Erklärung dessen, wie das Ergebnis der Daten aussehen soll, aktualisieren? Ich nahm an, imdb würde nach Titel eindeutig sein.Wenn dies nicht der Fall ist und Sie eine Gruppierung nach imdb durchführen, können Sie IDs und Titel angeben, die nicht in der Ergebnismenge enthalten sind, und die Treffer, die sich auf sie beziehen, werden ebenfalls ausgeschlossen. Ich bin mir sicher, dass es eine Möglichkeit gibt, diese Abfrage zu schreiben, aber Sie brauchen eine bessere Erklärung dessen, was Sie von den Daten wollen. –

+0

Ich habe die Frage bearbeitet, hoffe es ist jetzt klarer. Danke –

0

Ich hasse es zu sagen, aber dies ist eine dieser seltenen Gelegenheiten, wo eine temporäre Tabelle helfen könnte. Wenn Sie die Ergebnisse formulieren:

select 
    imdb, 
    id, 
    count(*) as cnt 
from subtitles 
group by 
    imdb, 
    id 

..into eine temporäre Tabelle, können Sie dann nutzen Sie die Zeilen, die Sie wirklich wollen:

select 
    t.imdb, 
    t.id, 
    t.cnt 
from MyTempTable t 
    inner join 
    (
    select 
     imdb, 
     max(cnt) as maxcnt 
    from MyTempTable 
    group by 
     imdb 
) as drv on t.imdb = drv.imdb and t.cnt = drv.maxcnt 

..und die Ergebnisse der oben verbunden sein können, zurück in Ihre Haupttabelle, ohne erneut gruppiert werden zu müssen.

Hilft das?

Entschuldigung dafür, nicht die ganze SQL in, aber ich bin für die Zeit gedrückt. Dies wird tun, was Sie wollen, aber wird immer noch duplizieren, wenn die Zählungen gleich sind. Die Abfrage könnte geändert werden, um damit umzugehen, wenn Sie sich darum kümmern.

Auf einer separaten Notiz, bin ich nicht sicher, warum Sie links in der Anweisung beitreten, wenn Sie keine Daten aus der linken Tabelle zeigen?

0

Ich würde versuchen, dies selbst zu testen, aber ich habe keine Daten oder eine gute Probe zum Testen.

SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS counter 
FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
GROUP BY h.subid 
having max(counter) 
ORDER BY count DESC LIMIT 15