2016-05-27 12 views
0

habe ich eine Tabelle als solche:MYSQL - Gruppe durch und Sortierung nach

ID Field1 Field2 Field3 
1  Apple  Fruit  Cheap 
2  Apple  Fruit  Eatable 
3  Apple  Food  Something 
4  Banana Fruit  Cheap 
5  Banana Food  Eatable 
6  Cat  Pet  Weird 
7  Cat  Pet  Friend 
8  Cat  Pet  Amazing 
9  Cat  Animal Cheap 

ich verschiedene Field1, Feld 2 Elemente und sortieren nach Field3 mit „billig“ erhalten möchten. Ich erwarte dies:

ID Field1 Field2 Field3 
1  Apple  Fruit  Cheap 
4  Banana Fruit  Cheap 
9  Cat  Animal Cheap 
3  Apple  Food  Something  
5  Banana Food  Eatable 
6  Cat  Pet  Weird 

Ergebnis mit ID hat row = 2,7,8 entfernt werden als ID = 2 gleiche field1 hat, field2 als ID = 1 und ID = 7,8 haben gleiche field1, field2 als ID = 6. ID = 1 und ID = 2 haben dasselbe Field1 und Field2. Nur eine der ID = 6,7,8 kommt zum Ergebnis, wenn Field1, Field2 eindeutig ist.

Ich habe versucht "Gruppierung" und "Reihenfolge nach Feld()", aber für die "Gruppierung" gewünschte Zeilen werden beseitigt. Zum Beispiel, nach der Gruppierung ID = 1 ist nicht vorhanden und ID = 2 Zeile ist vorhanden.

Meine aktuelle Abfrage ist:

select * from tbl 
group by field1,field2 
order by field(field3,"CHEAP") desc; 

Was mich geben nur zwei Reihen mit field3 = "billig" als "Gruppe von" erwägt ID = 2 anstelle von ID = 1

Kann mir jemand helfen ich damit?

Vielen Dank im Voraus.

+0

versuchen Was ist Ihre Frage? – Hooch

+1

Warum möchten Sie 2 und nicht 1 entfernen? –

+0

Ich möchte sicherstellen, dass alle Zeilen mit field3 = "Cheap" im Ergebnis vorhanden sind. Ich denke, ich sollte eine Art Unterabfrage anstelle von Gruppieren verwenden. – rohan

Antwort

2

Versuchen Sie folgendes:

SELECT t1.ID, t1.Field1, t1.Field2, t1.Field3 
FROM mytable AS t1 
JOIN (
    SELECT Field1, Field2, MAX(Field3) AS min_field3, 
     COUNT(CASE WHEN Field3 = 'Cheap' THEN 1 END) AS cnt_cheap 
    FROM mytable 
    GROUP BY Field1, Field2 
) AS t2 ON t1.Field1 = t2.Field1 AND 
      t1.Field2 = t2.Field2 AND 
      t1.Field3 = IF(t2.cnt_cheap = 1, 'Cheap', min_field3) 
ORDER BY FIELD(Field3, 'Cheap') DESC 

Die obige Abfrage nimmt die ‚billig‘ Datensatz aus einer Field1, Field2 Gruppe, wenn ein solcher Datensatz vorhanden ist, sonst nimmt er den Rekord der maximalen Field3 Wert.

+0

@rohan Meine Abfrage gibt das erwartete Ergebnis für die angegebenen Beispieldaten zurück. Du kannst Dubletten erhalten, falls 'Field3' für ein bestimmtes 'Field1, Field2'-Paar mehr als einmal wiederholt wird. –

+0

Danke, sehr. Bin dankbar! – rohan

0

können Sie dies auch

select id,field1,field2,field3 
from tabel1 
group by field3 
order by field1 DECS and field2 DECS