ich will immer ein Ergebnis
Mario
- datenbank
0 Frank (no reg)0 Bossie0 Mario
Hallo,
Ich möchte bei folgendem SQL auf jeden Fall ein Ergebnis zurück haben:
SELECT count(*), MAX(t.date)
FROM autor a, text t
WHERE a.ID = t.autor_ID and a.ID='1'
GROUP BY a.ID
Sinn des SQLs ist zu Zeigen, wieviel der Autor "1" geschrieben hat und wann der letzte Eintrag erfolgt ist.
Es kommt ein Ergebnis...
7, 2006-03-01 12:12:00
... sobald Autor "1" etwas geschrieben hat.
Ich will aber auch folgendes SQL-Ergebnis...
0, 0000-00-00 00:00:00
... wenn der Autor nichts geschrieben hat. Das kommt aber logischerweise nicht.
Ich will das Nichtvorhandensein nicht mit PHP prüfen (mysql_num_rows etc.)
Was muß ich also noch ergänzen?
Vielen Dank,
Mario
PS: Hier die Basics: MySQL 4.1, PHP4
Hi,
SELECT COUNT(*) ...
sollte immer ein Ergebnis (eine Zeile), ein Skalar (also eine Zeile mit mind. bzw. genau einer Spalte) zurückliefern. Mindestens 0 (nein, nicht NULL).
Und was ist jetzt eigentlich dein Problem? Wo willst du was ergänzen?
Ciao, Frank
Hi,
das ist richtig, aber gilt AFAIK nur wenn keine Gruppierung vorliegt. Im vorliegenden Fall ist aber ein WHERE-Kriterium so angelegt, dass überhaupt keine Datensätze zurückkommen, daher auch keine Gruppe entsteht und das DBMS es nicht für nötig hält einen Satz rauszugeben.
BTW: Was stünde deiner Meinung nach dann in MAX(t.date)? Da kann ich mir in so einem Fall gar keinen Reim draus machen - und ich bin gerade zu faul meine DB2 hochzufahren...
MfG
Rouven
Hi,
ich sehe, was du meinst. Hatte die FROM table, table als OUTER Join gedeutet ... isses aber wohl nicht, zmd nicht unter T-SQL :)
Das SQL vom OP impliziert einen Inner Join, der für den Autor 1 schon gar keinen Datensatz bringt und dann noch gegen Werte aus dem "keinen" Datensatz gruppieren soll.
Formulierst du die Abfrage hingegen mit einem ordentlichen Join, welcher für die Anforderung des OP auch angemessen ist, nämlich LEFT OUTER JOIN, dann bekommt man das gewünschte ein Ergebnis solange die WHERE Klausel auch Daten zulässt die in der linkesten Tabelle sind.
Also quasi so:
SELECT count(*), MAX(t.date)
FROM autor a
LEFT OUTER JOIN text t ON a.ID = t.autor_ID
WHERE and a.ID='1'
GROUP BY a.ID -- ob das sinn macht wenn man sowieso nur einen Datensatz erwartet?
Gibt es in der rechteren Tabelle dann kein Match, bleibt MAX(t.date) bei NULL. Ist ja auch verständlich, MAX von 100x NULL ist immernoch NULL. Dies beantwortet sicherlich deine Frage.
Ciao, Grüsse vom Zürichsee
Frank
hi nochmal, zu schnell gepostet :)
... mit dem LEFT OUTER JOIN kommt logischerweise dann immer bei COUNT(*) mind. 1 heraus, auch wenn es keinen Eintrag in der rechten Tabelle gibt. In diesem Fall sollte man natürlich querchecken, dass MAX(t.DATE) ungleich NULL ist
Ciao, Frank
Hi,
SELECT count(*), MAX(t.date)
FROM autor a, text t
WHERE a.ID = t.autor_ID and a.ID='1'
GROUP BY a.ID
formulier die Abfrage mal mit einem geeigneten JOIN um. Eventuell koennte auch HAVING zum Einsatz kommen. Und wegen der zweiten WHERE-Bedingung auch mal a.ID ins SELECT packen...
Was soll eigentlich GROUP BY a.ID, wenn a.ID='1'?
Bossie
Hallo Freunde,
vielen Dank für die Tipps.
Ich habe mich natürlich gewundert, das aufgrund Count(*) kein Ergebnis kam. Ich dachte, da bei MAX(date) kein Ergebnis kommt, wird Count mit aufgehoben.
Der gedankliche Fehler lag beim group. Das war zuviel. Jetzt läuft es wie gewünscht.
Gruss, Mario