2012-09-26 7 views
6

Meine Frage ist ähnlich wie SQL select Group query. Aber es gibt Änderungen im Schema und ich möchte ein anderes Ergebnis, wie unten erwähnt. die Lösungen der gegebenen Verbindung geben mir die richtigen Lösungen nicht. Sie können SQL fiddle verwenden, um dies zu lösen.SQL Select Abfrage Hilfe erforderlich

Unten ist meine Tabelle

Table1

+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 100 | Nokia | Mobiles | 
| 300 | Samesung | Mobiles | 
| 700 | Micromax | Mobiles | 
| 1000 | Karbonn | Mobiles | 
| 300 | Lava  | Mobiles | 
| 100 | Floyer | Gift | 
| 500 | Arichies | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

Jetzt will ich für jedes Produkt den beide niedrigsten Betrag angezeigt werden und wenn die Menge gleich ist dann jemand nach Alphabet Reihenfolge der make Spalte aufsteigend ..

.

Deshalb möchte ich einzelne SQL-Abfrage erstellen, die mich wie unten zur Folge gibt ..

+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 100 | Nokia | Mobiles | 
| 300 | Lava  | Mobiles | 
| 100 | Floyer | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

Bitte helfen Sie mir eine solche Abfrage zu erstellen ..

+0

möglich Duplikat [mysql: Mit LIMIT innerhalb GROUP BY N Ergebnisse pro Gruppe erhalten] (http://stackoverflow.com/questions/2129693/mysql-using-limit-in-group-by-to-get-n-Ergebnisse pro Gruppe). Werfen Sie einen Blick auf die akzeptierte Antwort mit einem [Link] (http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in) -sql /). – shahkalpesh

Antwort

1

Dies sollte Ihnen helfen ..

Zuerst man einen Fehler hatte, i t wird jetzt aktualisiert.

SELECT t.* 
FROM (
    SELECT @lim := 2, 
      @cg := '' 
    ) vars, 
    (select * from Table1 order by product,amount, make) t 
WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0 
    AND (@r := @r - 1) >= 0 
    AND (@cg := product) IS NOT NULL 
ORDER BY 
    product,amount, make 

hat Spaß mit ihm und mit dem Fiedler: http://sqlfiddle.com/#!2/bdd1a/115/0

+0

funktioniert gut, können Sie bitte erklären Sie es kurz in q oder 2 Satz – mahesh

+0

Es hatte einen Fehler, ist jetzt in Ordnung. Wie dem auch sei, es ist eine Implementierung für row_number() über (partition by .. order by oracle or mssql). Eine gute Erklärung, wie es funktioniert, finden Sie hier http://explainextended.com/2009/03/05/row-sampling/ –

0

Probieren Sie dieses:

select * from table1 ORDER BY amount DESC LIMIT 2; 
+0

Leider löst dies nicht das Problem, 2 Zeilen pro Gruppe zu bekommen, es würde 2 Zeilen insgesamt zurückgeben – Darkzaelus

+0

Dies wird nur 2 Gruppe zurückgeben, Sie verwechseln die Frage komplett! – ssilas777

0
SELECT amount, make,product 
FROM 
    (SELECT ROW_NUMBER() OVER (PARTITION BY product ORDER BY amount) AS RowID,* 
    FROM Table1) RESULT 
WHERE RowID <= 2 

das funktioniert gut in PostgreSQL, mysql nicht die Fenster-Funktion nicht unterstützt, durch ähnliche immer Arbeit Windowing-Funktion in mysql refer

+0

gibt den Fehler: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax entspricht, um Near '(PARTITION BY-Produkt ORDER BY-Menge) zu verwenden AS RowID, * FROM Tabelle1) RESULT WHERE R' in Zeile 3: SELECT Betrag, Marke, Produkt FROM (SELECT ROW_NUMBER() OVER (PARTITION NACH Produkt ORDER BY Menge) AS RowID, * FROM Tabelle1) RESULT WHERE RowID <= 2 – mahesh

+0

oh .. es funktioniert gut mit PostgreSQL, – solaimuruganv

+0

yah .. mysql Jungs sollten wirklich beginnen, die ordentlichen Sachen auf ihre zu implementieren Motoren auch. –