Nach COUNT() sortieren

Hallo,
ich würde mich selbst als Newbie bezeichnen und versuche mir gerade die
"Group"-Funktionen mit dem MySQL-Handbuch zu erschließen.

Folgendes Problem:
Ich habe eine Tabelle, die sieht wie folgt aus

Feld1_Name | Feld2_Beitrag
Frank | 23
Frank | 31
Stefan | 32
Stefan | 22
Jochen | 29

Ich will diese Tabelle nun sortieren nach
1. Häufigkeit des Vorkommens des Namens
2. Niedrigestem Beitrag

Ergebnis sollte also sein:
Stefan, Frank, Jochen,
also: Stefan (2x - 22), Frank (2x - 23), Jochen (1x)
(* Zahlen in Klammern muss ich NICHT ausgegeben haben*)

Mein Ansatz war:
"select COUNT(DISTINCT Feld1_Name) as ANZAHL, MIN(Feld2_Beitrag)as
NIEDRIGSTER from table where (..irgendwas...) group by Feld1_Name order by
ANZAHL desc";

Funktioniert nicht - offensichtlich irgnoriert er bei "GROUP" das "ORDER" -
hatte ich wohl überlesen.

Meine 2. Idee war
" ... group by ANZAHL..."
oder
"... group by COUNT(DISTINCT Feld1_Name)..."

Endet mit einer Fehlermeldung, dass ich nach 'ANZAHL' bzw. 'COUNT...' nicht
sortieren kann.

Was übersehe ich? Welcher Ansatz löst mein Problem oder hilft mir weiter?

Danke und einen schönen Abend

Frank
Frank Ehrlacher [ Di, 18 September 2007 21:39 ] [ ID #1823114 ]

Re: Nach COUNT() sortieren

Frank Ehrlacher schrieb:

> Mein Ansatz war:
> "select COUNT(DISTINCT Feld1_Name) as ANZAHL, MIN(Feld2_Beitrag)as
> NIEDRIGSTER from table where (..irgendwas...) group by Feld1_Name order
> by ANZAHL desc";

, Niedrigster ASC fehlt noch, wenn ich Deine Beschreibung oben richtig
deute. Außerdem solltest Du das DISTINCT bei COUNT weglassen, sonst
kommt immer 1 raus.


> Funktioniert nicht - offensichtlich irgnoriert er bei "GROUP" das
> "ORDER" - hatte ich wohl überlesen.

Eigentlich sollte er bei GROUP defaultmäßig nach dem geGROUPten ORDERn,
aber ORDER sollte dennoch funktionieren.


> Meine 2. Idee war
> " ... group by ANZAHL..."
> oder
> "... group by COUNT(DISTINCT Feld1_Name)..."
>
> Endet mit einer Fehlermeldung, dass ich nach 'ANZAHL' bzw. 'COUNT...'
> nicht sortieren kann.

Für diesen Fall hättest DU nach 1, also der ersten SPalte, sortieren können.


HTH,

Thomas
Thomas Rachel [ Mi, 19 September 2007 06:35 ] [ ID #1824048 ]

Re: Nach COUNT() sortieren

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Andreas Kretschmer [ Mi, 19 September 2007 07:33 ] [ ID #1824049 ]

Re: Nach COUNT() sortieren

"Andreas Kretschmer" <akretschmer [at] spamfence.net> schrieb

> test=*# select feld1, min(feld2), anzahl from (select n.feld1, n.feld2,
> foo.anzahl from n left join (select feld1, count(1) as anzahl from n
> group by feld1) foo using(feld1))bar group by feld1, anzahl order by
> 2,3,1;
> feld1 | min | anzahl
> --------+-----+--------
> Stefan | 22 | 2
> Frank | 23 | 2
> Jochen | 29 | 1
> (3 rows)


Hallo Andreas,

erst mal Danke -
zweitens bekomme ich das aber nicht auf mein Beispiel übertragen - habe
versucht, mich in temporäre Tabellen einzulesen (das ist das doch oder?) hab
dann aber wohl noch nen Hänger.

Also, meine Tabelle heißt
meine_tabelle
Die Felder
name,
beitrag,
id

(Anmerkung: Im 'Where-Kriterium' habe ich noch ein feld 'ort' und 'id' aus
einer weiteren tabelle 'meine_tabelle_2')

Meine Befehlszeile lautet jetzt:

$test="select meine_tabelle.name, min(meine_tabelle.beitrag), anzahl from
(select meine_tabelle.name, meine_tabelle.beitrag,
foo.anzahl from meine_tabelle left join (select meine_tabelle.name, count(1)
as anzahl from meine_tabelle group by meine_tabelle.name)
where ((ort.meine_tabelle_2 LIKE '".$q1."' and meine_tabelle.id =
meine_tabelle_2.id) GROUP BY meine_tabelle.name
foo using(meine_tabelle.name)) bar group by meine_tabelle.name, anzahl
order by 2,3,1";

das quittiert MySQL allerdings mit

Fehlermeldung=Every derived table must have its own alias

Wo mache ich den Fehler? Wo hätte ich noch etwas benennen müssen?

Danke für die Mithilfe!!!

Frank
Frank Ehrlacher [ Mi, 19 September 2007 19:28 ] [ ID #1824059 ]

Re: Nach COUNT() sortieren

Frank Ehrlacher schrieb:

> [...]
> Meine Befehlszeile lautet jetzt:
>
> $test="select meine_tabelle.name, min(meine_tabelle.beitrag), anzahl from
> (select meine_tabelle.name, meine_tabelle.beitrag,
> foo.anzahl from meine_tabelle left join (select meine_tabelle.name, count(1)
> as anzahl from meine_tabelle group by meine_tabelle.name)
> where ((ort.meine_tabelle_2 LIKE '".$q1."' and meine_tabelle.id =
> meine_tabelle_2.id) GROUP BY meine_tabelle.name
> foo using(meine_tabelle.name)) bar group by meine_tabelle.name, anzahl
> order by 2,3,1";
>
> das quittiert MySQL allerdings mit
>
> Fehlermeldung=Every derived table must have its own alias
>
> Wo mache ich den Fehler? Wo hätte ich noch etwas benennen müssen?
> [...]

Steht doch da: "derived tables" - wozu auch die Ergebnisse von
Subselects zählen - brauchen zwingend einen Alias. Also Aliase vergeben
(hinter die Subselects schreiben), dann tut's.


Tschüs,

Sebastian
Sebastian Suchanek [ Mi, 19 September 2007 20:18 ] [ ID #1824061 ]

Re: Nach COUNT() sortieren

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Andreas Kretschmer [ Mi, 19 September 2007 20:34 ] [ ID #1824062 ]

Re: Nach COUNT() sortieren

"Andreas Kretschmer" <akretschmer [at] spamfence.net> schrieb im Newsbeitrag
news:rm68s4-qv8.ln1 [at] news.a-kretschmer.de...

> Du hast das foo bei mir übersehen.

Hallo Andreas,
Danke für die Antwort - aber vielleicht macht mich die Uhrzeit etwas
begriffsstutzig:
Ich habe doch das

foo using(meine_tabelle.name))

eingebaut?

Aber ehrlich gesagt - ich finde gerade nicht, wo ich der temporärern Tabelle
den Alias zuweise ...

Damit es nicht heißt, ich würde mir keine Mühe geben: Habe das Manual
gelesen, insbes. hier 7.4.1 zu SELECT und m.E. auch verstanden.
Die temporärern habe ich mir versucht mit 7.2.5 zu erschließen... und auch
7.3. zu den Problemen studiert - aber da brauche ich offensichtlich eben
Hilfe ...

Danke!

Frank
Frank Ehrlacher [ Do, 20 September 2007 00:25 ] [ ID #1824966 ]

Re: Nach COUNT() sortieren

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Andreas Kretschmer [ Do, 20 September 2007 07:09 ] [ ID #1824969 ]

Re: Nach COUNT() sortieren

Andreas Kretschmer wrote:

>> Ich will diese Tabelle nun sortieren nach
>> 1. Häufigkeit des Vorkommens des Namens
>> 2. Niedrigestem Beitrag
....
> test=*# select feld1, min(feld2), anzahl from (select n.feld1, n.feld2,
> foo.anzahl from n left join (select feld1, count(1) as anzahl from n
> group by feld1) foo using(feld1))bar group by feld1, anzahl order by
> 2,3,1;

Versteh ich die Frage falsch, ist das nicht viel einfacher?

select feld1, min(feld2), count(*)
from tab
group by feld1
order by 3 desc, 2

und falls er Count/Min nicht ausgeben will:
select feld1
from tab
group by feld1
order by min(feld2) desc, count(*) asc

Dieter
dnoeth [ Fr, 21 September 2007 09:03 ] [ ID #1826046 ]

Re: Nach COUNT() sortieren

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Andreas Kretschmer [ Fr, 21 September 2007 09:07 ] [ ID #1826047 ]

Re: Nach COUNT() sortieren

Andreas Kretschmer wrote:

>> Versteh ich die Frage falsch, ist das nicht viel einfacher?
>>
>> select feld1, min(feld2), count(*)
>> from tab
>> group by feld1
>> order by 3 desc, 2
>
> Spielverderber;-)


Ich sag bei meinen Schulungen immer:
Es gibt immer mindestens 10 verschiedene Arten eine Aufgabe mit SQL zu
lösen, die Hälfte davon ist ganz mies, ein paar nicht schlecht und ein
paar ganz gut.
Es reicht meistens, wenn man keine miese Lösung schreibt :-)

Das heisst jetzt nicht unbedingt, dass deine mies ist ;-)

Dieter
dnoeth [ Fr, 21 September 2007 09:10 ] [ ID #1826048 ]
Datenbanken » de.comp.datenbanken.mysql » Nach COUNT() sortieren

Vorheriges Thema: Problem mit Prepared Statement und LIKE
Nächstes Thema: Datenbank-Modellierung