Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL: count, group by & where



stefaan
31-08-2003, 16:18
Servus!

Ich kämpfe derzeit mit folgendem Problem:
Hier einmal die Hälfte des Problems. So sieht die Abfrage aus:


mysql> select tbl_termine.id, count(tbl_termine.multi) as multi_group from tbl_termine group by tbl_termine.multi;
+----+-------------+
| id | multi_group |
+----+-------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 3 |
| 8 | 1 |
+----+-------------+
6 rows in set (0.00 sec)


Sieht eigentlich ganz gut aus, nur ich benötige in diese Abfrage noch eine WHERE Bedingung (where multi_group = 1). Eine Abfrage nach "where multi_group" geht nicht (unknown column multi_group in where clause), "where count(multi) = 1" geht auch nicht (Invalid use of group function).

Gibts da eine Möglichkeit, das ohne größere Umwege zu machen? :rolleyes:

Danke für die Hilfe....

Grüße, Stefan

kehj
01-09-2003, 10:07
Moin,

um jetzt mal meine bescheidenen SQL-Kenntnisse rauszuholen:

> select tbl_termine.id, count(tbl_termine.multi) as multi_group
> from tbl_termine
> group by tbl_termine.multi;

Ich würde daraus machen:

select tbl_termine.id, count(tbl_termine.multi) as multi_group
from tbl_termine
group by tbl_termine.multi
HAVING count(tbl_termine.multi) = 1
;

Kurzer Hintergrund: Du kannst mit WHERE nicht auf Gruppenattribute "zugreifen". Es gilt also nur für Dinge, die in der Tabelle stehen. HAVING kannst du dir praktisch wie ein WHERE für die GROUP BY Funktion vorstellen...

stefaan
01-09-2003, 14:49
Servus!

Danke, funktioniert!

In solche Tiefen bin ich wohl nicht vorgedrungen :D

Grüße, Stefan

stefaan
01-09-2003, 17:20
Servus!

Ich hätte da nochmals ein weiterführendes Problem.
Die Abfrage klappt jetzt, nur brauche ich jetzt nochmals alle Daten, die öfters vorkommen, einzeln. :rolleyes:

Die gegebene Abfrage bringt mir Daten wie


mysql> select tbl_termine.id, count(tbl_termine.multi) as multi_group from tbl_t
ermine group by tbl_termine.multi HAVING count(tbl_termine.multi) > 1;
+----+-------------+
| id | multi_group |
+----+-------------+
| 5 | 3 |
| 9 | 2 |
+----+-------------+
2 rows in set (0.00 sec)


Ich bräuchte jetzt aber alle Elemente, die öfters vorkommen, einzeln, also so:


mysql> select ?;
+----+-------------+
| id | multi_group |
+----+-------------+
| 5 | 3 |
| 6 | 3 |
| 7 | 3 |
| 9 | 2 |
| 10 | 2 |
+----+-------------+

Gruppierungen und einzelne Ausgaben lassen sich wohl kombinieren :confused:

Das ganze soll ein hierachisches Menü werden, wo manche Punkte Unterpunkte haben, manche nicht. Die erste Abrage ergibt die Punkte, mit der 2. Abfrage will ich die Unterpunkte reinloopen.

Edit: Hier die Originaltabelle:


mysql> select id, multi from tbl_termine;
+----+-------+
| id | multi |
+----+-------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 5 |
| 7 | 5 |
| 8 | 8 |
| 9 | 9 |
| 10 | 9 |
+----+-------+
10 rows in set (0.02 sec)


Danke nochmals... :)

Grüße, Stefan

kehj
01-09-2003, 18:10
Gruppierungen und einzelne Ausgaben lassen sich wohl kombinieren


Sozusagen. Wenn du Gruppiert, hast du keine gültigen Relationen mehr:

Deine Tabelle:

| id | b
| 4 | 4 |
| 5 | 5 |
| 6 | 5 |
| 7 | 5 |
| 8 | 8 |

Nach GROUP BY b:

| id | b |
| 4 | 4 |
|5,6,7 | 5 |
| 8 | 8 |

Du erhälst 3 Gruppen, jeweils eine für einen Wert von b. Jede dieser Gruppen enthält (möglicherweise) mehrere Relationen. Eine vollständige Relation wäre hier ja (ID, b). Da das nicht mehr der Fall ist, kriegst du irgendeine Zeile, die die Gruppe repräsentiert. (Meines Erachtens immer die erste Zeile der Gruppe, bin aber nicht sicher).

Lösung A:
Mach zwei Abfragen. Ist nicht schön, ich weiß.

Ich melde mich morgen nochmal...

kehj
01-09-2003, 18:32
Ich hab noch 'n Tutorial zum Thema SQL gefunden:

http://www.w3schools.com/sql/

Sah auf den ersten Blick nicht schlecht aus...

Vielleicht hilft's

stefaan
02-09-2003, 20:09
Servus!

Danke für den Link, das ist kurz und prägnant :D

Mit Joins und so hab ich auch noch nie ein Problem gehabt, aber das raff ich rigendwie net... :mad:

Danke für deine Hilfe... ;)

Grüße, Stefan

kehj
03-09-2003, 09:14
Was raffst du nicht?

Keine Probleme mit Joins?

Kennst du die Unterschiede zwischen Thetajoins, Outer Equijoin, Inner Equijoin? ;)
Da hat's bei mir gehapert...