Anzahl Datensätze aus 2 Tabellen

G

Guest

Guest
Hallo,

Diese Abfrage erzielt nicht das gewünschte Ergebnis:

"SELECT COUNT( t.text),COUNT( k.text) FROM texte t, kommentare k where id=1 group by t.text"

$rs[0] und $rs[1] sind beide gleich dem Produkt der Anzahl gefundener Datensätze aus beiden Tabellen.

"SELECT COUNT(distinct t.text),COUNT(distinct k.text) FROM texte t, kommentare k where id=1 group by t.text"

liefert nur ob ein Datensatz in einer Tabelle vorkommt. (0 oder 1 oder gar nichts)

Das erwünschte Ergebnis wäre aber die Anzahl Datensätze in texte und
die Anzahl Datensätze in kommentare.

Weiss jemand, wie ich ohne Unterabfrage dieses Resultat erreiche?

Gruss

Tümmel






 
Solange beide Tabellen gemeinsam im From-Abschnitt stehen, werden sie auch gemeinsam ausgewertet.

Also trennen:

CODE Select 1 As id, Count(*) As Anzahl From Tabelle1

Union

Select 2, Count(*) As Anzahl From Tabelle2

Order By id



und die zwei Zeilen dann nach dem Wert der ersten Spalte unterscheiden oder die durch OrderBy festgelegte Reihenfolge nutzen.

 
Danke,

Genauso hab ich's jetzt auch bewerkstelligt und mich durch die anschliessende Sortierung gequält.
(6 Zeilen Code in 3 Stunden.)
Es sind noch ein paar mehr Parameter in den Abfragen.

Dabei kann man ja echt zum mysql-Hasser werden.
mad.gif



Gruss

Tümmel
 
Ich gehe mal von PHP aus, da hättest du anstatt COUNT() in MySQL auch einfach die Funktion mysql_num_rows benutzen können.
 
QBFinest schrieb:

QUOTE Ich gehe mal von PHP aus, da hättest du anstatt COUNT() in MySQL auch einfach die Funktion mysql_num_rows benutzen können.


@QBFinest, das ist ein Vorschlag, der gehört zur Rubrik

'Die zehn größten Fehler beim Zugriff auf Datenbanken'

Eine Datenbank ermittelt die Zahl der Datensätze über den Index und liefert eine Zeile zurück. Stattdessen alle Datensätze exportieren und sie clientseitig (vom Webdienst) zählen lassen ist gruselig.
 
Da würde ich mal ganz klar mit JEIN antworten. Wenn man die Datensätze hinterher noch benötigt ist es durchaus sinnvoll wegen des einfacheren Handlings die Funktion mysql_num_rows zu verwenden. Dieser Thread ist ja der eindeutige Beweis dafür, dass gerade Datenbank Anfänger mit COUNT() Probleme haben. Wer nur die Anzahl der Datensätze wissen will sollte jedoch schon zu COUNT() greifen.
 
QUOTE (QBFinest @ Do 9.2.2006, 0:06) Da würde ich mal ganz klar mit JEIN antworten. Wenn man die Datensätze hinterher noch benötigt ist es durchaus sinnvoll wegen des einfacheren Handlings die Funktion mysql_num_rows zu verwenden. Dieser Thread ist ja der eindeutige Beweis dafür, dass gerade Datenbank Anfänger mit COUNT() Probleme haben. Wer nur die Anzahl der Datensätze wissen will sollte jedoch schon zu COUNT() greifen.

Hallo QFinest,

Die Idee mysql_num_rows zu benutzen ist in dem Fall wirklich nur subobtimal.
Daan müsste zwei myqsl_queries erstellen und falls man hinterher noch Daten benötigt, wie
z.B. in
"select count( t.text),t.text,t.time,1 from `text1` t where' group by t.text,h.time union select count(k.text),k.k.text,k.time,2 from `text2` k ) group by h.text,h.time

wäre das handling mit 2 Datensätzen und mysql_num_rows nicht nicht bedeutend langsamer, sondern auch noch schwieriger, da der 2. Datensatzcursor jedesmal mit mysq_data_seek bewegt werden müsste.

Ich bin von sql gewohnt, Funktionen auch in die where und group by Clause setzen zu können.
Da hat mysql wirklich noch erheblich Verbesserungsbedarf.

Gruss

Tümmel
 
Einfach ein leistungsfähigeres Backend verwenden. Dann geht:

CODE Select
(Select Count(*) From Tabelle1 Where ...) +
(Select Count(*) From Tabelle2 Where ...)

As Ergebnis


Sprich: Zwei zählende Unterabfragen direkt als Ausdruck zusammenaddieren, das liefert die eine Zelle mit dem gewünschten Wert zurück.

PS: Oben war nirgends die Rede davon, daß Einzelzeilen benötigt werden.
 
Zurück
Oben