GROUP BY nach Gruppengröße sortieren

S

sevY

Hi,

ich führe ein MySQL Select aus, welches mir aus einer Suchhistorie die 5 häufigsten Suchwörtes auswerfen soll:

Code:
$query=mysql_query("select search_id,phrase from ".TAB_SEARCH." group by phrase limit 0,5 ",$handler);

Sortiert wird nun nach search_id… ich würde jedoch so sortieren, dass die größte Gruppe abfolgend ausgegeben wird.
 
Versuch mal:

Code:
$query=mysql_query("select search_id,phrase from ".TAB_SEARCH." group by phrase ORDER BY COUNT(search_id) DESC limit 0,5 ",$handler);

hab das jetzt nicht getestet.

Gunter
 
Funktioniert nicht.
Ist COUNT() denn überhaupt zulässig in ORDER BY Klauseln?
 
probier mal sowas

select spalte1, anzahl from
(
select spalte1, count(*) as anzahl
from tabelle
group by spalte1
)
order by anzahl desc

ob sowas bei mysql geht weiß ich jedoch nicht
 
in oracle wird sowas mit rownum geregelt. ich werde mal googlen, ob sowas auch in mysql möglich ist.

gruss a1ien
 
ups, sorry, mein Fehler. Ja COUNT ist zulässig in einer "ORDER BY"-Klausel, habe ich schon oft verwendet.
Allerdings kann man COUNT nur auf die Spalten anwenden, nach denen auch gruppiert wird. Also am einfachsten "COUNT(*)"

Wenn das auch nicht klappt, sag nochmal Bescheid, dann muss ich es doch mal testen, ad hoc mache ich da auch oft Fehler.

Gunter
 
Code:
select count(1) as quantity, search_id, phrase from <table> group by phrase order by quantity desc limit 0,5

Yves schrieb:
Sortiert wird nun nach search_id

Nein, das sieht nur so aus.

Matt
 
hi,

habe noch ein wenig gegooglet und nachgedacht:

1)bruachste nicht group by sondern order by um die reihnfolge zu setzen
2)group by bruachste nur bei aggregationen, wie max,min,avg oder auch count, das wird aber sicher in einer unterabfrage gelöst
3) limit ist wohl der command zum ausgeben bestimmter zeilen, sprich limit 3,6 gibt zeilen 3-6 aus

hoffe das hat dir geholfen!
 
a1ien schrieb:
1)bruachste nicht group by sondern order by um die reihnfolge zu setzen

Beides, um genau zu sein.
2)group by bruachste nur bei aggregationen, wie max,min,avg oder auch count, das wird aber sicher in einer unterabfrage gelöst

MySQL kennt bis Version 4.1 keine Subselects. Der Threadstarter hat keine Version angegeben, unabhängig davon geht es auch ohne Subselect.

Matt
 
msslovi0 schrieb:
Nein, das sieht nur so aus.

Matt

Da wirkt sich die Reihenfolge der Datensätze, wie sie abgespeichert sind, aus.

funktionieren tut:
Code:
SELECT search_id,phrase, COUNT(*) as anzahl FROM TABLE GROUP BY phrase ORDER BY anzahl LIMIT 0,5
gerade getestet.

à propos macht "SELECT search_id..." nicht so viel Sinn, da "search_id" ein zufälliger Wert von einem der in dieser Gruppe enthaltenen Datensätze ist. Außer dir ist wirklich egal welchen du haben willst.

Gunter
 
Gunter_S schrieb:
Da wirkt sich die Reihenfolge der Datensätze, wie sie abgespeichert sind, aus.

Eben. Deshalb sieht es ja nur so aus. In Wirklichkeit wird gar nicht sortiert.

funktionieren tut:
Code:
SELECT search_id,phrase, COUNT(*) as anzahl FROM TABLE GROUP BY phrase ORDER BY anzahl LIMIT 0,5
gerade getestet.

Da fehlt ein 'desc' vor limit, sonst kommen als Ergebnis die fünf am seltensten eingegebenen Suchanfragen.

Evtl. sollte man den 'order by'-Teil auch noch etwas erweitern, z.B. zusätzlich noch nach 'phrase' sortieren, um bei gleich vielen Suchanfragen zweier unterschiedlicher Phrasen das ganze alphabetisch zu bekommen.

Matt
 
Code:
$query=mysql_query("select search_id,phrase, count(*) as quantity from ".TAB_SEARCH." group by search_id order by quantity desc limit 0,5 ",$handler);

Das funktioniert wunderbar! Vielen Dank an alle!

Liebe Grüße
Yves
 
Update:

Code:
//Ausgabe der 5 Topthemen
            $query=mysql_query("select search_id,phrase,count(search_id) as quantity from ".TAB_SEARCH." group by search_id order by quantity desc limit 0,5 ",$handler);
 
Yves schrieb:
Code:
$query=mysql_query("select search_id,phrase, count(*) as quantity from ".TAB_SEARCH." group by search_id order by quantity desc limit 0,5 ",$handler);

Das funktioniert wunderbar! Vielen Dank an alle!

Liebe Grüße
Yves

bist du dir sicher, dass du nach "search_id" gruppieren willst? Steht nicht in "phrase" dein Suchbegriff?
 
msslovi0 schrieb:
Evtl. sollte man den 'order by'-Teil auch noch etwas erweitern, z.B. zusätzlich noch nach 'phrase' sortieren, um bei gleich vielen Suchanfragen zweier unterschiedlicher Phrasen das ganze alphabetisch zu bekommen.

Das macht MySQL, soviel ich weiss, automatisch. Wenn keine order by Klausel eingefügt ist, wird nach dem ersten Feld ascending sortiert – bei übereinstimmenden wird das jeweils nächste Feld herangezogen.
 
Yves schrieb:
Das macht MySQL, soviel ich weiss, automatisch.

Nein. Es liest dann die Daten in der Reihenfolge aus, wie sie reingeschrieben wurden.

Matt
 
Ja, ich möchte nach search_id gruppieren. Damit kann ich dann die „Topthemen“ anzeigen lassen, da verschiedenen Suchbegriffe durchaus die selben search_ids haben können.

Nach phrase gruppiere ich dann, um die häufigsten Suchbegriffe zu bekommen.
 
Zurück
Oben Unten