Problem mit COUNT

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