Auftragsergebnisse durch Vorkommen
-
27-10-2019 - |
Frage
Ich habe die folgenden zwei Tabellen.
Lesemarktag (Lesezeichen, Tagid) Tag (Tagid, Titel)
Derzeit wähle ich alle Tags mit dem entsprechenden Lesezeichen aus. Das Problem ist, dass ich das Tag nur einmal auswählen möchte, um eine Doppelarbeit im Ergebnis zu vermeiden und nur die Tags zurückzubringen, die am meisten auftreten.
Dies ist meine aktuelle SQL -Abfrage:
SELECT Tag.Title
FROM `Tag` INNER JOIN BookmarkTag
WHERE BookmarkTag.BookmarkID = 1 AND Tag.TagID = BookmarkTag.TagID'
Lösung
Sie müssen die Join -Bedingung in einen einfügen ON
Klausel nach der JOIN
Stichwort. Nicht in dem where
Klausel.
Sie mischten SQL89 mit SQL92 -Syntax. Dies mag funktionieren, was ich nicht getestet habe, aber das ist schneller.
SELECT Tag.Title
FROM `Tag` t
INNER JOIN BookmarkTag b ON (t.tagid = b.tagid)
WHERE B.BookmarkID = 1
GROUP BY t.tagid
ORDER BY count(*) DESC
Um die Ergebnisse pro Tag eindeutig zu machen, tun Sie a group by
auf Tagid.
Dann kannst du order by
Das Auftreten von Count (*), um zu sehen, dass die Tags mit dem höchsten Ereignis nach oben schweben.
(Versuchen Sie immer zu verwenden count(*)
Weil es schneller ist als count(afield)
)
Andere Tipps
SELECT t.Title, COUNT(*) AS TitleCount
FROM BookmarkTag AS bt
INNER JOIN Tag AS t ON t.TagID = bt.TagID
GROUP BY t.Title
ORDER BY TitleCount DESC
Wenn Sie 7 beliebteste Titel erhalten möchten, fügen Sie hinzu LIMIT 7
am Ende der Abfrage oder einer anderen Nummer. Meine Version wird alles in absteigender Reihenfolge ihrer Popularität erzeugen.