COUNT(...) ohne Gruppierung
COUNT(...) ohne Gruppierung
am 07.04.2006 21:15:54 von public
Hi!
Ich habe folgende Situation:
Tabelle 'namen':
| id | name |
-------------
| 1 | bli |
| 2 | blo |
Tabelle 'kommentare'
| id | nid | text |
-------------------
| 1 | 1 | abc |
| 2 | 1 | xyz |
| 3 | 2 | jkjk |
Nun möchte ich mit einem einzigen Query folgendes Resultat erhalten:
| name | text | anzahl |
-------------------------
| bli | abc | 2 |
| bli | xyz | 2 |
| blo | jkjk | 1 |
Mein erster Versuch war:
---
|SELECT namen.name,kommentare.text,COUNT(kommentare.text) AS anzahl
|FROM namen LEFT JOIN kommentare ON namen.id=kommentare.nid
---
Das hat natürlich nicht geklappt, weil COUNT ein GROUP BY verlangt.
Den LEFT JOIN mache ich, weil ich auch die Namen benötige, zu denen
es keinen Kommentar gibt.
Dann habe ich das Query angepasst:
---
|SELECT namen.name,kommentare.text,COUNT(kommentare.text) AS anzahl
|FROM namen LEFT JOIN kommentare ON namen.id = kommentare.nid
|GROUP BY namen.name
---
Das gibt mir zwar alle Namen und die jeweils korrekte Anzahl, aber
(auch darüber wundere ich mich nicht) zeigt nur einen einzigen
Kommentar pro Namen an.
Nun meine Frage an euch: Gibt es überhaupt eine Möglichkeit, mein
Resultat mit einem einzigen Query zu erhalten?
Vielen Dank für Tipps.
Gruss
Philipp
Re: COUNT(...) ohne Gruppierung
am 07.04.2006 21:42:13 von Gerrit Beine
Philipp E. Imhof wrote:
> Hi!
>
Hallo,
> Dann habe ich das Query angepasst:
> ---
> |SELECT namen.name,kommentare.text,COUNT(kommentare.text) AS anzahl
> |FROM namen LEFT JOIN kommentare ON namen.id = kommentare.nid
> |GROUP BY namen.name
> ---
>
> Das gibt mir zwar alle Namen und die jeweils korrekte Anzahl, aber
> (auch darüber wundere ich mich nicht) zeigt nur einen einzigen
> Kommentar pro Namen an.
>
was kein Wunder ist, da Du ja nach Namen gruppierst.
> Nun meine Frage an euch: Gibt es überhaupt eine Möglichkeit, mein
> Resultat mit einem einzigen Query zu erhalten?
>
Nein, denn das Anzeigen aller Kommentare pro Name und das Zählen der
Kommentare sind zwei unterschiedliche Probleme - zumindest für MySQL.
Mach einen Query mit Group by name.name, kommentare.text und einen
mit count(kommentare.text), group by name.name.
Gruss...
Gerrit
Re: COUNT(...) ohne Gruppierung
am 07.04.2006 22:00:23 von public
Danke für deine Antwort.
Gerrit Beine schrieb:
> Nein, denn das Anzeigen aller Kommentare pro Name und das Zählen der
> Kommentare sind zwei unterschiedliche Probleme - zumindest für MySQL.
Schade. Von aussen sieht diese Problemstellung gar nicht so
schwierig aus, aber das wird sicher seine Gründe haben.
> Mach einen Query mit Group by name.name, kommentare.text und einen
> mit count(kommentare.text), group by name.name.
Wenn ich "GROUP BY name.name, kommentare.text" nehme, kann ich doch
das GROUP BY auch gleich weglassen, oder? Ich sehe da keinen
Unterschied; was aber nichts heissen muss...
Gruss
Philipp
Re: COUNT(...) ohne Gruppierung
am 07.04.2006 22:11:59 von Gerrit Beine
Philipp E. Imhof wrote:
> Danke für deine Antwort.
>
> Gerrit Beine schrieb:
>> Nein, denn das Anzeigen aller Kommentare pro Name und das Zählen der
>> Kommentare sind zwei unterschiedliche Probleme - zumindest für MySQL.
>
> Schade. Von aussen sieht diese Problemstellung gar nicht so
> schwierig aus, aber das wird sicher seine Gründe haben.
>
Ist ja auch nicht schwierig, sind halt nur unterschiedliche Sachen.
>> Mach einen Query mit Group by name.name, kommentare.text und einen
>> mit count(kommentare.text), group by name.name.
>
> Wenn ich "GROUP BY name.name, kommentare.text" nehme, kann ich doch
> das GROUP BY auch gleich weglassen, oder? Ich sehe da keinen
> Unterschied; was aber nichts heissen muss...
>
Das kommt auf die Kommentare an...
Wenn identische dabei sind, werden diese dann nicht mit angezeigt.
Sind aber alle Kommentage unterschiedlich, kannst du's weglassen, das
ist richtig.
Gruss...
Gerrit
Re: COUNT(...) ohne Gruppierung
am 07.04.2006 23:45:35 von Thomas Rachel
Philipp E. Imhof wrote:
> Nun möchte ich mit einem einzigen Query folgendes Resultat erhalten:
> | name | text | anzahl |
> -------------------------
> | bli | abc | 2 |
> | bli | xyz | 2 |
> | blo | jkjk | 1 |
Tut es
select name,k1.text,count(*) from namen left join kommentare k1 on
namen.id=k1.nid left join kommentare k2 on namen.id=k2.nid group by
k1.id
?
Hier zählt das count die "ebenfalls" passenden, die nacheinander in k2
erscheinen würden, wenn man sie lieÃe.
HTH,
Thomas
--
Blödsinnige Liedtexte, Teil 2:
"Mein Säugling gerade StraÃe mich eine Leiter"
"Zl onol whfg ebnq zr n ynqqre"/
"Zl onol whfg jebgr zr n yrggre"
Re: COUNT(...) ohne Gruppierung
am 08.04.2006 12:37:18 von public
Thomas Rachel schrieb:
> Tut es
>
> select name,k1.text,count(*) from namen left join kommentare k1 on
> namen.id=k1.nid left join kommentare k2 on namen.id=k2.nid group by
> k1.id
>
> ?
Wow! Das macht genau das, was ich wollte. Darf ich dazu auch noch um
eine Erklärung bitten, denn ich verstehe das nicht vollständig.
Danke & Gruss
Philipp
Re: COUNT(...) ohne Gruppierung
am 09.04.2006 19:02:12 von Thomas Rachel
Philipp E. Imhof wrote:
> Thomas Rachel schrieb:
>> Tut es
>>
>> select name,k1.text,count(*) from namen left join kommentare k1 on
>> namen.id=k1.nid left join kommentare k2 on namen.id=k2.nid group by
>> k1.id
>>
>> ?
>
> Wow! Das macht genau das, was ich wollte. Darf ich dazu auch noch um
> eine Erklärung bitten, denn ich verstehe das nicht vollständig.
Dröseln wir mal auf (ich weià es nämlich selbst nicht mehr genau :-}):
USE test;
CREATE TABLE namen (id int, name char(3));
CREATE TABLE kommentare (id int, nid int, text char(4));
INSERT INTO namen (id,name) VALUES (1,'bli'), (2,'blo');
INSERT INTO kommentare (id,nid,text) VALUES (1,1,'abc'),(2,1,'xyz')
(3,2,'jkjk');
Wende ich hierauf meinen Join von oben an, lasse aber das GROUP BY weg,
dann verknüpft er mir die Tabelle kommentare 2x mit der Tabelle namen,
macht also eine Kreuzkombination, separiert nach nid:
mysql> select name,k1.*,k2.* from namen left join kommentare k1 on
namen.id=k1.nid left join kommentare k2 on namen.id=k2.nid;
+------+------+------+------+------+------+------+
| name | id | nid | text | id | nid | text |
+------+------+------+------+------+------+------+
| bli | 1 | 1 | abc | 1 | 1 | abc |
| bli | 1 | 1 | abc | 2 | 1 | xyz |
| bli | 2 | 1 | xyz | 1 | 1 | abc |
| bli | 2 | 1 | xyz | 2 | 1 | xyz |
| blo | 3 | 2 | jkjk | 3 | 2 | jkjk |
+------+------+------+------+------+------+------+
5 rows in set (0,00 sec)
Füge ich jetzt den GROUP BY hinzu, faÃt er mir alle zusammen, die
identisches k1.id haben und zählt sie. k2 gibt hier also quasi an:
"Welche anderen habe ich noch?"
HTH,
Thomas
--
Tragetaschen haben alle eine GröÃe: Gerade etwas zu klein!