Komplizierte SQL-Abfrage (JOIN & ORDER BY)
Dennis2
- php
0 Blaubaum0 Dennis20 Vinzenz Mai0 Dennis2
0 _King Lully
Hallo Community!
Ich habe folgendes Problem:
In einer Tabelle habe ich Namen gespeichert (Tabelle1) und jeder Name wird genau zu einer Stadt zugeordnet. In einer zweiten Tabelle habe ich einträge, wie oft jemand für eine Stadt gevotet wurde (Tabelle2). Nun möchte ich aus Tabelle1 die ersten 10 Namen abholen welche für eine Stadt am meisten gevoted wurden. (Ist kaum verständlich oder?)
Hier der Code:
-----------------------------------------
SELECT * FROM tabelle1
JOIN tabelle2 ON (tabelle2.user = tabelle1.id)
WHERE tabelle1.stadt = 'Velbert'
ORDER BY tabelle2.COUNT(*)
LIMIT 10
-----------------------------------------
Der Knackpunkt liegt hier eindeutig an "ORDER BY tabelle2.COUNT(*)".
Wie kann ich also bittesehr die ausgewählten 10 Einträge danach sortieren, wie oft die UserID in tabelle2 eingetragen ist?
MfG,
Dennis
Wie kann ich also bittesehr die ausgewählten 10 Einträge danach sortieren, wie oft die UserID in tabelle2 eingetragen ist?
Garnicht. Woher soll die DB denn wissen, welches Feld du hier mit COUNT zählst? Du fragst nach * ab und zwar ohne GROUP. Das heisst ja schonmal, dass da garnichts zusammengefasst wird.
Wie kann ich also bittesehr die ausgewählten 10 Einträge danach sortieren, wie oft die UserID in tabelle2 eingetragen ist?
Garnicht. Woher soll die DB denn wissen, welches Feld du hier mit COUNT zählst? Du fragst nach * ab und zwar ohne GROUP. Das heisst ja schonmal, dass da garnichts zusammengefasst wird.
Ich möchte eben, dass die Einträge in Tabelle2 passend zu Tabelle1 ausgezählt werden mit dem COUNT-Befehl - ich weiß, dass das so nicht klappt aber irgendwie muss das doch möglich sein ohne den COUNT(*)-Wert in eine Extra Tabelle zu schreiben?
MfG,
Dennis2
Hallo Dennis,
Ich möchte eben, dass die Einträge in Tabelle2 passend zu Tabelle1 ausgezählt werden mit dem COUNT-Befehl - ich weiß, dass das so nicht klappt aber irgendwie muss das doch möglich sein ohne den COUNT(*)-Wert in eine Extra Tabelle zu schreiben?
bitte gib die relevante Tabellenstrukturen, d.h. die beiden beteiligten Tabellen mit den relevanten Spalten bekannt, am besten mit ein paar Beispieldatensätzen und dem gewünschten Ergebnis.
Sehr informativ wäre noch das verwendete Datenbankmanagementsystem mit Angabe der vorhandenen Version - ich vermute, Du verwendest MySQL, zur Version schwieg sich meine Glaskugel beharrlich aus.
Es ist übrigens ein Unterschied, ob man die Abfrage so formuliert, dass zu genau einer Stadt 10 Datensätze angezeigt werden oder ob man die Abfrage allgemeiner formuliert, so dass zu jeder Stadt in der Ergebnismenge 10 Datensätze angezeigt werden - und über die WHERE-Klausel die gewünschte Einschränkung erfolgt.
Sehr wahrscheinlich werden Dir korrelierte Unterabfragen weiterhelfen. MySQL unterstützt Unterabfragen (auch Subselects genannt) erst ab Version 4.1.
Konkretere Hilfe ist nur möglich bei konkreteren Angaben. Insbesondere wirst Du Dein scheinbar bequemes SELECT * aufgeben müsseh.
Freundliche Grüße
Vinzenz
Sehr wahrscheinlich werden Dir korrelierte Unterabfragen weiterhelfen. MySQL unterstützt Unterabfragen (auch Subselects genannt) erst ab Version 4.1.
Vielen Dank, genau so etwas habe ich gesucht!
MfG,
Dennis
Ich habe folgendes Problem:
In einer Tabelle habe ich Namen gespeichert (Tabelle1) und jeder Name wird genau zu einer Stadt zugeordnet. In einer zweiten Tabelle habe ich einträge, wie oft jemand für eine Stadt gevotet wurde (Tabelle2). Nun möchte ich aus Tabelle1 die ersten 10 Namen abholen welche für eine Stadt am meisten gevoted wurden. (Ist kaum verständlich oder?)
Kennst Du die Regel Nummer eins? ;)
Wichtig ist immer die sinnvolle Benamung. Was soll 'Tabelle1' und 'Tabelle2'?
Hast Du eine Tabelle 'Cities' und eine Tabelle 'Votings', wobei jede Stadt n-fach gevotet werden kann?
Falls ja mal sowas versuchen:
SELECT * FROM tabelle1
JOIN tabelle2 ON (tabelle2.user = tabelle1.id)
WHERE tabelle1.stadt = 'Velbert'
ORDER BY tabelle2.COUNT(*)
LIMIT 10
SELECT
id,
count(*) as ID_Count
FROM
tabelle1 -- Hüstel
JOIN
tabelle2 -- Hüstel
ON
(tabelle2.user = tabelle1.id) -- Hüstel
GROUP BY
id
ORDER BY
ID_Count DESC
LIMIT
0, 10
Keine Garantie auf den Code, bitte ggf. prüfen.
Also kein "WHERE tabelle1.stadt = 'Velbert'" sondern stattdessen eine Gruppierung. (Hoffe mal, dass der JOIN OK war.)