2012-09-26 18 views
6

Moje pytanie jest podobne do SQL select Group query. Ale jest zmiana schematu i chcę inny wynik, jak wspomniano poniżej. rozwiązania danego linku nie dają mi właściwych rozwiązań. Możesz użyć rozwiązania SQL fiddle, aby rozwiązać ten problem.Wymagana jest pomoc dotycząca zapytań SQL Select

Poniżej jest moje Tabela

Tabela1

+--------+----------+---------+ 
| 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 | 
+--------+----------+---------+ 

Teraz chcę, aby wyświetlić dwa najniższą kwotę dla każdego produktu i jeżeli wysokość jest taka sama wtedy ktoś rosnąco według kolejności alfabetu make kolumnie .. .

Więc chcę zbudować kwerendę pojedynczego SQL które daje mi wynik jak poniżej ..

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

uprzejmie mi pomóc zbudować taką kwerendę ..

+0

możliwe duplikat [mysql? Używając dopuszczalnych w GROUP BY, aby uzyskać wyniki w każdej grupie N] (http://stackoverflow.com/questions/2129693/mysql-using-limit-within-group-by-get-n-results-per-group). Spójrz na zaakceptowaną odpowiedź na ten temat za pomocą [link] (http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in -sql /). – shahkalpesh

Odpowiedz

1

To powinno pomóc ..

Pierwszy z nich miał błąd, ja t jest teraz aktualizowany.

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 

baw się z nim oraz z Skrzypek: http://sqlfiddle.com/#!2/bdd1a/115/0

+0

działa dobrze, mógłbyś wyjaśnić to krótko w q lub 2 zdanie – mahesh

+0

Miał błąd, jest w porządku. W każdym razie jest to implementacja dla row_liczba() ponad (partycja według .. porządku przez .. oracle lub mssql). Dobre wyjaśnienie tego, jak to działa, można znaleźć tutaj: http://explainextended.com/2009/03/05/row-sampling/ –

0

Wypróbuj tego:

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

Niestety to nie rozwiązuje problemu z uzyskaniem 2 wierszy na grupę, zwróciłoby 2 wiersze ogółem – Darkzaelus

+0

To tylko zwróci 2 grupę, pomyliłeś to pytanie całkowicie! – 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 

to działa dobrze w PostgreSQL, mysql nie obsługuje funkcję okna, dostając pracę podobną funkcja okienkowy w mysql refer

+0

podaje błąd: Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu "(PARTYCJA WEDŁUG ilości produktu ORDER BY) AS RowID, * Z tabeli 1) WYNIK, GDZIE R" w wierszu 3: WYBIERZ ilość, marka, produkt OD (WYBIERZ ROW_NUMBER() OVER (PARTYCJA POPRZEZ produkt o kwotę OR) AS RowID, * Z tabeli 1) WYNIK, GDZIE RowID <= 2 – mahesh

+0

oh .. działa dobrze z PostgreSQL, – solaimuruganv

+0

yah .. mysql faceci powinni naprawdę zacząć wdrażać fajne rzeczy na ich temat także silniki. –