SQL zum sammeln von Daten aus einer Tabelle, während das zählen von Datensätzen, die in einem anderen
Ich habe eine Tabelle users und eine Lieder-Tabelle, wählen Sie alle Benutzer in der Benutzer-Tabelle, während das zählen, wie viele songs haben Sie in den songs-Tabelle. Ich habe dieses SQL, aber es funktioniert nicht, kann jemand spot, was ich falsch mache?
SELECT jos_mfs_users.*, COUNT(jos_mfs_songs.id) as song_count
FROM jos_mfs_users
INNER JOIN jos_mfs_songs
ON jos_mfs_songs.artist=jos_mfs_users.id
Hilfe ist sehr willkommen. Danke!
In welcher Weise wird es nicht funktionieren? Gibt es eine Fehlermeldung, oder einfach nur unerwartete Ergebnisse?
Ich vermute, dass die Anzahl der Songs ist 1 für jeden Datensatz.
Ich vermute, dass die Anzahl der Songs ist 1 für jeden Datensatz.
InformationsquelleAutor Wasim | 2011-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Inner join funktioniert nicht, denn es schließt jede übereinstimmende Zeile in die songs, die Tabelle mit der Benutzer-Tabelle.
Verwenden
HAVING
zu vergleichen, um ein Aggregat wie einCOUNT
Man könnte hinzufügen, (SELECT COUNT ()...) - Klausel eine WHERE-Anweisung. Ich werde es Bearbeiten, um zu zeigen, dass. Sie könnten versuchen, die "having" - Klausel.
SELECT A.*, (SELECT COUNT(*) FROM B WHERE B.a_id = A.id) AS TOT FROM A
eine sehr viel einfachere soluitonInformationsquelleAutor Narnian
Gibt es eine
GROUP BY
- Klausel fehlt, z.B.Wenn Sie möchten, fügen Sie weitere Spalten aus
jos_mfs_users
in der select-Liste, die Sie hinzufügen sollten Sie in derGROUP BY
- Klausel.GROUP BY
und entfernen der*
InformationsquelleAutor phlogratos
Änderungen:
Nicht
SELECT *
...geben Sie Ihre Felder. Ich habe die ID und den NAMEN, können Sie fügen Sie mehr als nötig, aber setzen Sie Sie in dieGROUP BY
sowieGeändert
LEFT JOIN
-INNER JOIN
nicht Liste alle Benutzer, die haben keine LiederHinzugefügt, die
GROUP BY
so gibt es eine gültige Zählung und ist gültige syntaxInformationsquelleAutor JNK
Versuchen
InformationsquelleAutor christopher_b
Scheint das eine viele zu viele Beziehung. Ich meine es sieht aus wie es können mehrere Datensätze in der Tabelle Benutzer für jeden Benutzer, jedes Lied, das Sie haben.
Ich würde drei Tabellen.
Benutzer, die einen Datensatz für jeden Benutzer
Songs, die einen Datensatz für jedes Lied
USER_SONGS, die einen Datensatz für jeden Benutzer - /song-Kombination
Nun, Sie können tun, eine Anzahl von songs, die jeder Benutzer hat, indem Sie eine Abfrage auf die Zwischentabelle. Sie können auch herausfinden, wie viele Benutzer ein bestimmtes Lied.
Dies wird Ihnen sagen, wie viele songs, die jeder Benutzer hat
Dies wird Ihnen sagen, wie viele Benutzer, jeder song hat
Ich bin sicher, Sie werden Sie brauchen, um zu zwicken, für Ihre Bedürfnisse, aber es kann Ihnen die Art der Ergebnisse, die Sie suchen.
Können Sie sich auch entweder diese Abfragen zu den beiden anderen Tabellen zu finden, der user name und/oder Künstlername.
HTH
Harv Sather
ps ich bin nicht sicher, wenn Sie auf der Suche nach song zählt oder Künstler zählt.
InformationsquelleAutor Harv
Benötigen Sie eine
GROUP BY
- Klausel Aggregatfunktionen verwenden (wieCOUNT()
zum Beispiel)So, unter der Annahme, dass
jos_mfs_users.id
ist ein Primärschlüssel, so etwas wie dies funktionieren wird:Beachten Sie, dass
COUNT()
ist die Anzahl der Zeilen, die sind gruppiert (in diesem Fall die Anzahl der Ergebnisse pro Benutzer)SELECT *
undGROUP BY
auf einem einzelnen Feld - er wird bekommen, zufällige Datensätze prousers.id
, wenn seine SQL-engine, die auch ermöglicht es (die meisten nicht)Wie wird diese zufällige Datensätze zurückgeben? Für jede Ergebnis-Zeile gruppiert nach jos_mfs_users.id, werden alle Felder aus jos_mfs_users werden die gleichen sein! Und keine Felder von jos_mfs_songs sind
SELECT
ed (es gibt nur eineCOUNT()
). Ich glaube, du irrst dich!Sie sind VORAUSGESETZT alle anderen Felder werden die gleichen sein. OP nicht an, es war ein eindeutiges Feld oder PK. Felder Auswählen, die nicht in Ihrer
GROUP BY
oder in eine aggregation ist ein anti-pattern zu vermeiden. Periode.Ok, Sie sind richtig. Ich habe bearbeitet die Antwort auf meine Vermutung.
InformationsquelleAutor edam