User nach Einträgen in anderer Tabelle sortieren
Holgi
- datenbank
Hallo,
also... ich habe in einer DB zwei Tabellen, eine mit Usern, die andere mit Einträgen der User (die Einträge sind über die IDs der User mit den Usern verknüpft).
Jetzt möchte ich die User auflisten - sortiert nach der Anzahl ihrer Einträge. Geht das?
Also im Prinzip so etwas:
SELECT ... FROM Usertabelle ORDER BY [Anzahl der Einträge in Datentabelle]
Danke,
Holger
Welches Datenbanksystem? Bei MSSQL könnte das so klappen (ungetestet)
[code language=sql]
SELECT u.ID, x.counted
FROM Usertabelle u
LEFT OUTER JOIN
(SELECT COUNT(*) AS counted
FROM Anderetabelle a
GROUP BY ID) x
ON u.ID = x.ID
ORDER BY x.counted ASC
[/code]
Gruss Sepp
Hallo,
also... ich habe in einer DB zwei Tabellen, eine mit Usern, die andere mit Einträgen der User (die Einträge sind über die IDs der User mit den Usern verknüpft).
Jetzt möchte ich die User auflisten - sortiert nach der Anzahl ihrer Einträge. Geht das?
Also im Prinzip so etwas:
SELECT ... FROM Usertabelle ORDER BY [Anzahl der Einträge in Datentabelle]Danke,
Holger
Welches Datenbanksystem? Bei MSSQL könnte das so klappen
MySQL. Aber ich werde mir das Prinzip mal genauer anschauen!
Danke,
Holger
Moin!
Ein "natural join' kann das ganz einfach.
SELECT
users.username AS username,
COUNT(id.beitraege) as beitraege
FROM datenbank.users, datenbank.beitraege
WHILE 1
AND datenbank.users.id=datenbank.beitraege.user_id
ORDER BY beitraege;
(Das mit WHILE 1 AND ... ist eine Macke von mir, weil ich meine Abfragebedingungen immer öfter in einer anderen Programmiersprache zusammen baue.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
yo,
SELECT
users.username AS username,
COUNT(id.beitraege) as beitraege
FROM datenbank.users, datenbank.beitraege
c 1
AND datenbank.users.id=datenbank.beitraege.user_id
ORDER BY beitraege;
es ist noch früh am morgen, da bin ich noch nicht ganz wach. aber zählt dein COUNT nicht alle datensätze, ohne rücksicht auf den benutzer oder habe ich noch nebel auf den augen ? fehlt da nicht noch eine gruppierung, bzw. eine unterabfrage ?
Ilja
Hallo,
also... ich habe in einer DB zwei Tabellen, eine mit Usern, die andere mit Einträgen der User (die Einträge sind über die IDs der User mit den Usern verknüpft).
Jetzt möchte ich die User auflisten - sortiert nach der Anzahl ihrer Einträge. Geht das?
Also im Prinzip so etwas:
SELECT ... FROM Usertabelle ORDER BY [Anzahl der Einträge in Datentabelle]Danke,
Holger
Irgendwie kennt kaum jemand die normale Kreuabfrage mit zwei Tabellen und einem Where.
Also: Was du brauchst ist ganz einfach diese Abfrage:
Select Usertabelle.username
From Usertabelle, Eintragstabelle
Where Usertabelle.userid = Eintragstabelle.userid
Group By Usertabelle.username
Order By Count(Eintragstabelle.Eintragsid) desc;
Damit sortierst du den User nach oben, der die meisten Einträge hat. Wenn du den User mit den wenigsten Einträgen an erster Stelle haben willst, lass das desc weg. Der Trick ist einfach das Count als OrderBy-Kriterium zu verwenden. Damit musst du es nicht anzeigen lassen.
MfG Mero
yo,
Irgendwie kennt kaum jemand die normale Kreuabfrage mit zwei Tabellen und einem Where.
wie kommst du auf diese these ? ich bin mir sicher, sehr viele kennen das kreuzprodukt sehr gut. und das was du da machst, ist keine kreuzabfrage (auch bekannt als karthesisches produkt), sondern ein ganz normaler INNER JOIN.
des weiteren ist der GROUP BY nur über den usernamen kritisch. sicherlich könnte es sich um ein UNIQUE attribut handeln, muss aber nicht. und da du schon über die id's "joinst", bietet es sich auch an, die id in die gruppierung mit reinzunéhmen, um die abfragre wasserdicht zu machen.
auch den COUNT würde ich nicht über eine spalte bilden, obwohl es in deinem falle keine probleme geben sollte, sondern mit COUNT(*) bilden. dann ist auf einem blick sofort klar, dass alle datens#tze gezählt werden sollen.
Ilja
yo,
Irgendwie kennt kaum jemand die normale Kreuabfrage mit zwei Tabellen und einem Where.
wie kommst du auf diese these ? ich bin mir sicher, sehr viele kennen das kreuzprodukt sehr gut. und das was du da machst, ist keine kreuzabfrage (auch bekannt als karthesisches produkt), sondern ein ganz normaler INNER JOIN.
des weiteren ist der GROUP BY nur über den usernamen kritisch. sicherlich könnte es sich um ein UNIQUE attribut handeln, muss aber nicht. und da du schon über die id's "joinst", bietet es sich auch an, die id in die gruppierung mit reinzunéhmen, um die abfragre wasserdicht zu machen.
auch den COUNT würde ich nicht über eine spalte bilden, obwohl es in deinem falle keine probleme geben sollte, sondern mit COUNT(*) bilden. dann ist auf einem blick sofort klar, dass alle datens#tze gezählt werden sollen.
Ilja
Ja, ich weiss, dass das keine Kreuzabfrage ist. Deshalb hab ich ja auch den Teil mit dem Where hinzugeschrieben. Unglücklich formuliert. Sorry. Bezog mich also auf das Where, anstelle des Joins und nicht auf die Kreuzabfrage an sich.
Mir ist nur aufgefallen, dass ich fast überall nur Joins sehe, die ich persönlich schwer zu lesen finde, anstatt ein einfaches Where.
Das Count mach ich nur deshalb über lediglich eine Spalte, weil ich der Meinung bin, dass das schneller geht, als ein Count über alle Spalten.
Mit dem Group By hast du natürlich Recht. Da hab ich diese Schwachstelle übersehen. So funktioniert es jetzt aber richtig... Danke für den Hinweis.
select username
from usertabelle,eintragstabelle
where eintrageintragstabelle.userid=userusertabelle.userid
group by usertabelle.username,usertabelle.userid
order by count(Eintrag.id);
MfG Mero
select username
from usertabelle,eintragstabelle
where eintrageintragstabelle.userid=userusertabelle.userid
group by usertabelle.username,usertabelle.userid
order by count(Eintrag.id);
Hmpf... Schon blöd, wenn man nicht ordentlich nachsieht, bevor man das wegschickt.
Select username
From Usertabelle,Eintragstabelle
Where Eintragstabelle.userid=Usertabelle.userid
Group By Usertabelle.username,Usertabelle.userid
Order By Count(Eintragstabelle.id);
MfG Mero
yo,
Das Count mach ich nur deshalb über lediglich eine Spalte, weil ich der Meinung bin, dass das schneller geht, als ein Count über alle Spalten.
wenn du COUNT() über eine spalte benutzt, dann wird das dbms überprüfen, ob der inhalt der jeweiligen felder nicht NULL ist. diese werte werden nämlich nicht mitgezählt. ob er das auch für spalten macht, welche die eigenschaft NOT NULL haben, kann ich nicht zu 100% sagen, würde aber auf ja tippen. was aber wichtiger ist, dass bei der benutztung von COUNT(*) das dbms auf keinen fall inhalte prüfen wird und somit am schnellsten arbeitet. damit ist man also auf der sicheren seite.
Ilja