sehr kompliziert: Datensätze zählen, aber...

DataFox

Erfahrenes Mitglied
Hi SQL-Freaks :)

Ich habe folgendes Problem:

In einer Tabelle mytable befinden sich viele Datensätze. Sagen wir mal es sind Lieder die zu einer CD gehören (stark vereinfachtes Beispiel).

Es gibt folgende Felder: id, titel, groupCode

Das dumme daran: man kann nur an hand des groupCodes feststellen welche Lieder auf eine CD gehören.

Ich selecte ein Lied und möchte als nette Nebeninformation mit angeben wieviele andere Lieder es noch zu dieser CD gibt. Also: Wieviele andere Lieder es noch gibt, die den gleichen groupCode haben.

Nur dummer weise liefert mir eine Abfrage nach diesem schema:

Code:
SELECT x.id, x.titel, COUNT(x.id) AS lieder FROM mytable AS x 
RIGHT OUTER JOIN mytable AS x2 ON x2.groupCode=x.groupCode 
WHERE x.groupCode = 'xGhJk63f' 
GROUP BY x2.groupCode 
LIMIT 0,1

nicht die Anzahl der Lieder, sondern die Anzahl der lieder hoch 2. Also potenziert. Glaube das nennt man auch "kartesisches Produkt". MySQL verknüpft jeden Datensatz mit dem groupCode mit jedem anderen und zählt das.

Hoffe ihr versteht worauf ich hinaus will... ich kriege es nicht gebacken MySQL dazu zu bringen mir einfach nur die Anzahl der Lieder raus zu geben. Einen Extra-Query wollte ich mir eigentlich sparen...

Habt ihr einen Tipp?

Gruß
Laura
 
Zuletzt bearbeitet:
Hallo,

könntest du vielleicht eine Datenbankausprägung zur Verfügung stellen, bei der das Problem auftritt? Ich kann dieses Verhalten nämlich bei mir nicht reproduzieren:
Code:
mysql> select * from mytable;
+----+-------+-----------+
| id | titel | groupCode |
+----+-------+-----------+
|  1 | a     |         1 |
|  2 | b     |         1 |
|  3 | c     |         1 |
|  4 | d     |         2 |
|  5 | e     |         2 |
|  6 | f     |         3 |
+----+-------+-----------+
6 rows in set (0.00 sec)

mysql> select x.id, x.titel, count(x.id) as lieder
    -> from mytable x
    -> right outer join mytable x2 on x2.groupCode = x.groupCode
    -> where x.id = 1
    -> group by x2.groupCode;
+------+-------+--------+
| id   | titel | lieder |
+------+-------+--------+
|    1 | a     |      3 |
+------+-------+--------+
1 row in set (0.00 sec)

mysql>

Grüße,
Matthias
 
Hi

sorry ich habe es wohl falsch beschrieben...

man selected nicht nach der id, sondern nach dem groupCode und arbeitet mit Limit:

Code:
mysql> select x.id, x.titel, count(x.id) as lieder
    -> from mytable x
    -> right outer join mytable x2 on x2.groupCode = x.groupCode
    -> where x.groupCode = 1 
    -> group by x2.groupCode 
    -> LIMIT 0,1;

in dem Skript ist es dummer weise nicht möglich nach der id zu gehen, da die id nicht bekannt ist.

ich herhalte so immer die potenzierte Anzahl zurück, da ja erst einmal z.b. 10 Datensätze gefunden werden, und das Limit erst später wirkt... :(

Gruß
Laura
 
Hallo Laura,

vielleicht so?
Code:
mysql> SELECT id, titel, COUNT(*) AS lieder
    -> FROM mytable
    -> WHERE groupCode = 1
    -> GROUP BY groupCode;
+----+-------+--------+
| id | titel | lieder |
+----+-------+--------+
|  1 | a     |      3 |
+----+-------+--------+
1 row in set (0.00 sec)
Wobei das schon ziemlich grenzwertig ist, da man keinen direkten Einfluss darauf hat, aus welchem Tupel id und titel kommen. Andere RDBMS würden eine solche Anfrage gar zurückweisen. Aber vielleicht genügt es ja doch deinen Ansprüchen.

Grüße,
Matthias
 
Hallo

danke für die Hilfe :)
Ich habe es jetzt doch in 2 Queries aufgeteilt, weil ich merkte das es klug ist gleich alle lieder mit raus zu holen, da ich sie ohnehin anzeigen lassen will.

Gruß
Laura
 
Zurück