Nach COUNT() sortieren

Nach COUNT() sortieren

am 18.09.2007 21:39:24 von Frank Ehrlacher

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

Re: Nach COUNT() sortieren

am 19.09.2007 06:35:08 von Thomas Rachel

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

Re: Nach COUNT() sortieren

am 19.09.2007 07:33:19 von Andreas Kretschmer

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

Re: Nach COUNT() sortieren

am 19.09.2007 19:28:07 von Frank Ehrlacher

"Andreas Kretschmer" 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

Re: Nach COUNT() sortieren

am 19.09.2007 20:18:14 von Sebastian Suchanek

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

Re: Nach COUNT() sortieren

am 19.09.2007 20:34:35 von Andreas Kretschmer

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)

Re: Nach COUNT() sortieren

am 20.09.2007 00:25:39 von Frank Ehrlacher

"Andreas Kretschmer" schrieb im Newsbeitrag
news:rm68s4-qv8.ln1@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

Re: Nach COUNT() sortieren

am 20.09.2007 07:09:54 von Andreas Kretschmer

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

Re: Nach COUNT() sortieren

am 21.09.2007 09:03:27 von dnoeth

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

Re: Nach COUNT() sortieren

am 21.09.2007 09:07:27 von Andreas Kretschmer

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

Re: Nach COUNT() sortieren

am 21.09.2007 09:10:50 von dnoeth

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