2010-03-02 12 views
11

Soweit ich weiß, mysql GROUP BY Gruppen zum letzten Datensatz gefunden.GROUP BY geben Sie den ersten Datensatz

Gibt es eine Lösung für GROUP BY zum ersten Datensatz?

Ich habe den Befehl ORDER in SQL eingerichtet und ich brauche GROUP BY den ersten Datensatz und nicht den letzten zurückgeben.

EDIT

Hier ist die Abfrage

SELECT 
    DISTINCT(master.masterID), 
    langData.*, 
    master.* 
FROM master_table as master 
INNER JOIN lang_table as langData ON 
langData.masterID=master.masterID 
GROUP BY master.masterID 
ORDER BY 
CASE 
    WHEN langData.lang='currentLang' THEN 1 ELSE 999 END , 
    master.name desc LIMIT 0,10 

Die Abfrage oben wählen Sie die masterID für mehrsprachige Tabelle und nehmen wir an FIRST die Datensätze in currentLang und sie mit Namen, um zurückzukehren und dann alle anderen Sprachen.

Frag mich nicht, warum ich die Sprache nicht in JOIN einstelle. Dies ist der Weg, der getan werden muss.

Also alles funktioniert gut bis jetzt erwartet das Szenario, dass ich einen Datensatz mit den Sprachen en und fr habe. Wenn currentLangen ist dann basierend auf

langData.lang='currentLang' THEN 1 ELSE 999 END 

die en Auftrag ist 1 und fr Auftrag ist 999 und statt den Wert von en bekomme ich den Wert von fr bekommen.

Deshalb möchte ich in die erste Reihe gruppieren.

+0

Ich werde Sie nicht fragen, warum Sie nicht die Sprache, in der 'JOIN' gesetzt eher werde ich dir sagen, dass es auf diese Weise nicht funktionieren wird. Ein nicht aggregierter Ausdruck in 'GROUP BY' gibt einen beliebigen Datensatz aus jeder Gruppe zurück und soll nicht verwendet werden, wenn die Werte variieren. Sie können einen beliebigen Datensatz aus 'master_table' zurückgeben (sie sind alle in jeder Gruppe gleich), aber nicht aus' lang_table'. Es gibt keine Garantie, dass der Datensatz zurückgegeben wird, nada, niente. "BTW", warum hast du hier "DISTINCT", was ist der Zweck? – Quassnoi

+0

Ich versuche zu erreichen "gebe mir zuerst alle Datensätze aus der aktuellen Sprache Reihenfolge nach Namen und dann für alle anderen Sprachen nach Namen sortieren" Bedeutung: wenn aktuelle lang ist EN dann alle Datensätze für EN und dann alle Datensätze für andere Sprachen. WENN in der lang-Tabelle für einen Datensatz hat EN, FR gibt den EN-Wert zurück. IF in lang-Tabelle EN ist nicht vorhanden return any lang – ntan

+0

dies ist sehr einfach zu tun mit einem 'JOIN' wie hier beschrieben: http: // explainextended. com/2009/08/10/fallback-language-names-mysql/aber aus irgendeinem seltsamen Grund (über den du nicht einmal gefragt werden willst), willst du ihn nur ungern benutzen. – Quassnoi

Antwort

11

Ich nehme an, Sie sprechen von so etwas wie

SELECT * 
FROM mytable 
GROUP BY 
     column 

Sie sollten nicht unaggregierter Ausdrücke in GROUP BY verwenden, sofern sie nicht alle gleich in der Gruppe sind.

Wenn Sie den Datensatz zurückgeben möchten den geringsten Wert eines Ausdrucks innerhalb einer Gruppe halten, benutzen Sie dies:

SELECT mo.* 
FROM (
     SELECT DISTINCT column 
     FROM mytable 
     ) md 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.column = md.column 
     ORDER BY 
       mi.column, mi.someorder 
     LIMIT 1 
     ) 
1

Fügen Sie LIMIT 1 zu Ihrer Abfrage hinzu.

+0

nicht möglich. Datensatz für das Raster und Paging – ntan