Group by Problem

Group by Problem

am 17.07.2006 15:27:37 von Werner Hofer

Hallo zusammen

Ich habe ein elementares Group by Problem und wäre für Hilfe dankbar.

Die Tabelle test hat 3 Felder:
- id (int)
- typ(char,1)
- text (varchar)

id | typ | text
-----------------
1 a aaa1
2 a aaa2
3 b bbb1
4 c ccc1
5 c ccc2
6 c ccc3
7 c ccc4
------------------



Nun möchte ich diese Tabell in folgnder Weise abfragen:

- "Zeige mir die n Records aller Typen (a, b und c)"


Bei n=1 wäre die Ausgabe : Records mit ID's 1, 3 und 4
Bei n=2 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5
Bei n=3 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5 und 6
Bei n=4 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
Bei n=5 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
etc.

Ich habe es mit folgender Anweisung probiert, jedoch ohne Erfolg: select
id, typ, text, count(*) from test group by typ limit n;


Kann mir jemand helfen dieses Problem zu lösen?

Besten Dank im voraus
Werner

Re: Group by Problem

am 17.07.2006 15:40:13 von Johannes Vogel

Hi Werner

Werner Hofer wrote:
> Ich habe ein elementares Group by Problem und wäre für Hilfe dankbar.
> Die Tabelle test hat 3 Felder:
[...]
> Bei n=1 wäre die Ausgabe : Records mit ID's 1, 3 und 4
> Bei n=2 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5
> Bei n=3 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5 und 6
> Bei n=4 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
> Bei n=5 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
> Ich habe es mit folgender Anweisung probiert, jedoch ohne Erfolg: select
> id, typ, text, count(*) from test group by typ limit n;
> Kann mir jemand helfen dieses Problem zu lösen?

Du könntest die Ergebnisse mittels user variables durchnummerieren (bei
neuem typ neu beginnen) und dann mittels having filtern.

set @old=1, @nr=0;
select id, typ, text, if(@old=typ, @nr:=@nr+1, @nr:=1) nr, @old:=typ
from tabelle having nr <= $n;

ungetestet.
Du findest mehr über User Variables hier: RTM 9.3
http://dev.mysql.com/doc/refman/5.1/en/user-variables.html

Nix mit group by also.. :-)
HTH, Johannes

Re: Group by Problem

am 17.07.2006 16:01:07 von Christian Kirsch

Werner Hofer schrieb:
> Hallo zusammen
>
> Ich habe ein elementares Group by Problem und wäre für Hilfe dankbar.
>
> Die Tabelle test hat 3 Felder:
> - id (int)
> - typ(char,1)
> - text (varchar)
>
> id | typ | text
> -----------------
> 1 a aaa1
> 2 a aaa2
> 3 b bbb1
> 4 c ccc1
> 5 c ccc2
> 6 c ccc3
> 7 c ccc4
> ------------------
>
>
>
> Nun möchte ich diese Tabell in folgnder Weise abfragen:
>
> - "Zeige mir die n Records aller Typen (a, b und c)"
>
>
> Bei n=1 wäre die Ausgabe : Records mit ID's 1, 3 und 4

Warum nicht 2, 3 und 7? Ich verstehe den Zusammenhang zwischen n und
der Ausgabe nicht. Oder möchtest Du gerne die jeweils *ersten* n
Records haben, wobei Du nach text sortierst (oder nach ID oder nach ?)

Re: Group by Problem

am 17.07.2006 16:14:31 von Andreas Sakowski

Hallo

"Werner Hofer" schrieb
> Hallo zusammen
>
> Ich habe ein elementares Group by Problem und wäre für Hilfe
> dankbar.
>
> Die Tabelle test hat 3 Felder:
> - id (int)
> - typ(char,1)
> - text (varchar)
>
> id | typ | text
> -----------------
> 1 a aaa1
> 2 a aaa2
> 3 b bbb1
> 4 c ccc1
> 5 c ccc2
> 6 c ccc3
> 7 c ccc4
> ------------------
>
>
>
> Nun möchte ich diese Tabell in folgnder Weise abfragen:
>
> - "Zeige mir die n Records aller Typen (a, b und c)"
>
>
> Bei n=1 wäre die Ausgabe : Records mit ID's 1, 3 und 4
> Bei n=2 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5
> Bei n=3 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5 und 6
> Bei n=4 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6
> und 7
> Bei n=5 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6
> und 7
> etc.

select a.id from bla a
left join bla b on b.typ = a.typ and b.id < a.id
group by a.id
having count( distinct b.id ) <= n - 1

könnte das sein, was Du suchst.

Gruß
Andreas

Re: Group by Problem

am 17.07.2006 16:15:43 von Werner Hofer

Hallo

Besten Dank für deine Antwort.

Richtig, es wären die jeweils *ersten* n Records


Gruss
Werner

"Christian Kirsch" schrieb im Newsbeitrag
news:44bb9823$0$10526$9b4e6d93@newsread4.arcor-online.net...
> Werner Hofer schrieb:
>> Hallo zusammen
>>
>> Ich habe ein elementares Group by Problem und wäre für Hilfe dankbar.
>>
>> Die Tabelle test hat 3 Felder:
>> - id (int)
>> - typ(char,1)
>> - text (varchar)
>>
>> id | typ | text
>> -----------------
>> 1 a aaa1
>> 2 a aaa2
>> 3 b bbb1
>> 4 c ccc1
>> 5 c ccc2
>> 6 c ccc3
>> 7 c ccc4
>> ------------------
>>
>>
>>
>> Nun möchte ich diese Tabell in folgnder Weise abfragen:
>>
>> - "Zeige mir die n Records aller Typen (a, b und c)"
>>
>>
>> Bei n=1 wäre die Ausgabe : Records mit ID's 1, 3 und 4
>
> Warum nicht 2, 3 und 7? Ich verstehe den Zusammenhang zwischen n und
> der Ausgabe nicht. Oder möchtest Du gerne die jeweils *ersten* n
> Records haben, wobei Du nach text sortierst (oder nach ID oder nach ?)
>
>

Re: Group by Problem

am 17.07.2006 16:55:03 von Werner Hofer

Hallo Andreas

Fantastisch, genau das war's!

Herzlichen Dank
Werner

"Andreas Sakowski" schrieb im Newsbeitrag
news:e9g63o$r7m$02$1@news.t-online.com...
> Hallo
>
> "Werner Hofer" schrieb
>> Hallo zusammen
>>
>> Ich habe ein elementares Group by Problem und wäre für Hilfe dankbar.
>>
>> Die Tabelle test hat 3 Felder:
>> - id (int)
>> - typ(char,1)
>> - text (varchar)
>>
>> id | typ | text
>> -----------------
>> 1 a aaa1
>> 2 a aaa2
>> 3 b bbb1
>> 4 c ccc1
>> 5 c ccc2
>> 6 c ccc3
>> 7 c ccc4
>> ------------------
>>
>>
>>
>> Nun möchte ich diese Tabell in folgnder Weise abfragen:
>>
>> - "Zeige mir die n Records aller Typen (a, b und c)"
>>
>>
>> Bei n=1 wäre die Ausgabe : Records mit ID's 1, 3 und 4
>> Bei n=2 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5
>> Bei n=3 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5 und 6
>> Bei n=4 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
>> Bei n=5 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
>> etc.
>
> select a.id from bla a
> left join bla b on b.typ = a.typ and b.id < a.id
> group by a.id
> having count( distinct b.id ) <= n - 1
>
> könnte das sein, was Du suchst.
>
> Gruß
> Andreas
>
>

Re: Group by Problem

am 17.07.2006 16:58:45 von Werner Hofer

Hallo Johannes

Besten Dank für deinen Vorschlag. Sehr gerne werde ich diesen auch prüfen.

Herzlichen Dank
Werner

"Johannes Vogel" schrieb im Newsbeitrag
news:78022$44bb9334$544a5456$27381@news.hispeed.ch...
> Hi Werner
>
> Werner Hofer wrote:
>> Ich habe ein elementares Group by Problem und wäre für Hilfe dankbar.
>> Die Tabelle test hat 3 Felder:
> [...]
>> Bei n=1 wäre die Ausgabe : Records mit ID's 1, 3 und 4
>> Bei n=2 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5
>> Bei n=3 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5 und 6
>> Bei n=4 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
>> Bei n=5 wäre die Ausgabe : Records mit ID's 1, 2, 3, 4, 5, 6 und 7
>> Ich habe es mit folgender Anweisung probiert, jedoch ohne Erfolg:
>> select
>> id, typ, text, count(*) from test group by typ limit n;
>> Kann mir jemand helfen dieses Problem zu lösen?
>
> Du könntest die Ergebnisse mittels user variables durchnummerieren (bei
> neuem typ neu beginnen) und dann mittels having filtern.
>
> set @old=1, @nr=0;
> select id, typ, text, if(@old=typ, @nr:=@nr+1, @nr:=1) nr, @old:=typ
> from tabelle having nr <= $n;
>
> ungetestet.
> Du findest mehr über User Variables hier: RTM 9.3
> http://dev.mysql.com/doc/refman/5.1/en/user-variables.html
>
> Nix mit group by also.. :-)
> HTH, Johannes