Problem mit COUNT
am 24.06.2006 15:12:55 von Christian Schmidt
Hallo,
ich habe folgende Tabellen (nur die relevanten Spalten, MySQL 5.0):
a.artikel_nr a.artikel_anz
11111 5
22222 3
33333 2
und
b.artikel_nr
11111
11111
22222
22222
22222
33333
33333
Nun möchte ich folgendes herausbekommen:
Artikelnummern, bei denen die Anzahl pro artikel_nr in b.artikel_nr gleich
dem Wert aus a.artikel_anz ist.
11111 und 33333 sind jeweils zweimal in b.artikel_nr, 22222 dreimal.
Das Ergebnis der Abfrage wäre dann: 22222 und 33333
Meine Versuche gingen in die Richtung:
SELECT a.artikel_nr FROM a WHERE a.artikel_anz = (SELECT COUNT(*) FROM b
GROUP BY b.artikel_nr);
Fehler: Subquery returns more than 1 row.
grenzen
Beide SELECTs funktionieren ja einzeln und ich bekomme ein Ergebnis wie:
a.artikel_nr a.artikel_anz COUNT(b.artikel_nr)
11111 5 2
22222 3 3
33333 2 2
Nur kann ich a.artikel_anz nicht mit COUNT vergleichen :-(
Kann mir bitte jemand helfen.
Gruß
Chris
--
Jetzt auch bei mir: http://blog.superbilk.org
Re: Problem mit COUNT
am 24.06.2006 18:51:02 von thborsdorf
Hi Christian!
Versuch mal:
SELECT a.artikel_nr FROM a
WHERE a.artikel_anz = (
SELECT COUNT(*) FROM b
WHERE b.artikel_nr = a.artikel_nr //Hier die Änderung/Ergänzung!!!
GROUP BY b.artikel_nr
);
Ungetestet...
MfG Thomas.
Christian Schmidt schrieb am 24.06.2006 15:12:
> Hallo,
>
> ich habe folgende Tabellen (nur die relevanten Spalten, MySQL 5.0):
>
> a.artikel_nr a.artikel_anz
> 11111 5
> 22222 3
> 33333 2
>
> und
>
> b.artikel_nr
> 11111
> 11111
> 22222
> 22222
> 22222
> 33333
> 33333
>
>
> Nun möchte ich folgendes herausbekommen:
> Artikelnummern, bei denen die Anzahl pro artikel_nr in b.artikel_nr gleich
> dem Wert aus a.artikel_anz ist.
>
> 11111 und 33333 sind jeweils zweimal in b.artikel_nr, 22222 dreimal.
> Das Ergebnis der Abfrage wäre dann: 22222 und 33333
>
> Meine Versuche gingen in die Richtung:
> SELECT a.artikel_nr FROM a WHERE a.artikel_anz = (SELECT COUNT(*) FROM b
> GROUP BY b.artikel_nr);
>
> Fehler: Subquery returns more than 1 row.
> grenzen
>
> Beide SELECTs funktionieren ja einzeln und ich bekomme ein Ergebnis wie:
> a.artikel_nr a.artikel_anz COUNT(b.artikel_nr)
> 11111 5 2
> 22222 3 3
> 33333 2 2
>
> Nur kann ich a.artikel_anz nicht mit COUNT vergleichen :-(
>
> Kann mir bitte jemand helfen.
>
> Gruß
>
> Chris
>
Re: Problem mit COUNT
am 24.06.2006 19:18:57 von Christian Schmidt
Am Sat, 24 Jun 2006 18:51:02 +0200 schrieb Borsdorf, Thomas:
> Hi Christian!
>
> Versuch mal:
>
> SELECT a.artikel_nr FROM a
> WHERE a.artikel_anz = (
> SELECT COUNT(*) FROM b
> WHERE b.artikel_nr = a.artikel_nr //Hier die Änderung/Ergänzung!!!
> GROUP BY b.artikel_nr
> );
>
> Ungetestet...
....und funktioniert auf Anhieb. Vielen Dank.
Ich sitzt jetzt schon seit Stunden daran und dachte ich haette jede
Kombination getestet...
Gruß
Chris
--
Jetzt auch bei mir: http://blog.superbilk.org
Re: Problem mit COUNT
am 24.06.2006 19:45:53 von ascii158
Christian Schmidt wrote:
> Nun möchte ich folgendes herausbekommen:
> Artikelnummern, bei denen die Anzahl pro artikel_nr in b.artikel_nr gleich
> dem Wert aus a.artikel_anz ist.
>[...]
> Meine Versuche gingen in die Richtung:
> SELECT a.artikel_nr FROM a WHERE a.artikel_anz = (SELECT COUNT(*) FROM b
> GROUP BY b.artikel_nr);
>
> Fehler: Subquery returns more than 1 row.
Zusätzlich zur Lösung von Thomas:
SELECT a.artikel_nr FROM a WHERE a.artikel_anz IN (SELECT COUNT(*) FROM
b GROUP BY b.artikel_nr);
--
Philipp Tölke
PGP 0x96A1FE7A
Re: Problem mit COUNT
am 24.06.2006 20:17:09 von Christian Schmidt
Am Sat, 24 Jun 2006 19:45:53 +0200 schrieb Philipp Tölke:
> SELECT a.artikel_nr FROM a WHERE a.artikel_anz IN (SELECT COUNT(*) FROM
> b GROUP BY b.artikel_nr);
Das hatte ich auch schonmal als "Loesung", aber hier das Gegenbeispiel:
a.artikel_nr a.artikel_anz
11111 2
22222 2
33333 3
44444 3
55555 2
b.artikel_nr
11111
22222
22222
33333
33333
33333
44444
55555
Richtiges Ergebis: 22222, 33333
Bei Dir kommt aber: 11111, 22222, 33333, 44444, 55555
Liegt am IN ;-)
Gruß
Chris
--
Jetzt auch bei mir: http://blog.superbilk.org
Re: Problem mit COUNT
am 24.06.2006 20:20:12 von dnoeth
Philipp Tölke wrote:
>> Nun möchte ich folgendes herausbekommen:
>> Artikelnummern, bei denen die Anzahl pro artikel_nr in b.artikel_nr gleich
>> dem Wert aus a.artikel_anz ist.
....
> Zusätzlich zur Lösung von Thomas:
>
> SELECT a.artikel_nr FROM a WHERE a.artikel_anz IN (SELECT COUNT(*) FROM
> b GROUP BY b.artikel_nr);
Nö, das gibt alle zurück, die mit irgendeinem count übereinstimmen.
Wenn schon, dann so ("multiple match" kann aber mysql nicht):
SELECT a.artikel_nr FROM a
WHERE (a.artikel_nr, a.artikel_anz) IN
(SELECT artikel_nr, COUNT(*)
FROM b
GROUP BY artikel_nr)
Ansonsten geht's auch noch so:
SELECT a.artikel_nr
FROM a join
(
SELECT artikel_nr, COUNT(*) as cnt
FROM b
GROUP BY artikel_nr
) b
ON a.artikel_nr = b.artikel_nr
AND a.artikel_anz = b.cnt
Dieter
Re: Problem mit COUNT
am 24.06.2006 23:15:57 von Dominik Echterbruch
[TOFU repariert]
Borsdorf, Thomas wrote:
>>
>> ich habe folgende Tabellen (nur die relevanten Spalten, MySQL 5.0):
>>
>> a.artikel_nr a.artikel_anz
>> 11111 5
>> 22222 3
>> 33333 2
>>
>> und
>> b.artikel_nr
>> 11111
>> 11111
>> 22222
>> 22222
>> 22222
>> 33333
>> 33333
>>
>>
>> Nun möchte ich folgendes herausbekommen:
>> Artikelnummern, bei denen die Anzahl pro artikel_nr in b.artikel_nr
>> gleich
>> dem Wert aus a.artikel_anz ist.
>
> Versuch mal:
>
> SELECT a.artikel_nr FROM a
> WHERE a.artikel_anz = (
> SELECT COUNT(*) FROM b
> WHERE b.artikel_nr = a.artikel_nr //Hier die Änderung/Ergänzung!!!
> GROUP BY b.artikel_nr
> );
Warum Umwege machen und (IMO) schwer lesbare Statements bauen, wenn
GROUP BY doch auch das HAVING kennt? Die elegantere Form:
SELECT a. artikel_nr, a.anzahl, COUNT(*)
FROM a INNER JOIN b USING (artikel_nr)
GROUP BY a.artikel_nr, a.anzahl
HAVING count(*) = a. anzahl;
Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal