2012-12-14 15 views
6

Mam tabelę w MySQL, która zawiera nazwę kolumny category. Próbuję napisać zapytanie, które zwróci 2 losowe rekordy z każdego category.Pobierz dowolną liczbę losowych wierszy z każdej kategorii "według kategorii" w MySQL

Oto kod, który używam do dostać 2 rekordy z każdej category z najwyższych wartości w moim rating kolumny:

SELECT e1.* 
FROM entries AS e1 
WHERE (SELECT Count(*) 
     FROM entries AS e2 
     WHERE e2.category = e1.category 
       AND e1.rating <= e2.rating) <= 2 
ORDER BY category, 
      rating DESC 

Sprawdź ten link, aby zobaczyć tabelę z niektórych przykładowych danych i wyżej zapytania: http://sqlfiddle.com/#!9/bab8e/1

+1

czego dokładnie potrzebujesz. 2 losowe rekordy z każdej kategorii? czy coś, czy to dotyczy kwerendy, które zawarłeś ..!? – Chella

+0

Zapytanie jest właśnie po to, aby pokazać, z czym pracuję, że mam 30 wpisów w tabeli 10 każdej kategorii, chciałbym pobrać 2 losowe wpisy każdej z tych kategorii. To by zwróciło 6 wyników. – Ivar

+0

Zobacz ten wpis: http://stackoverflow.com/questions/984396/how-to-get-mysql-random-integer-range – ntgCleaner

Odpowiedz

1

Osiągnąłem pożądane wyniki, sortując tabelę według kolumny kategorii i losowej liczby. Następnie przypisałem zwiększającą się liczbę do każdego wiersza, który zaczyna się od każdego o wartości 1 za każdym razem, gdy zmieniła się kategoria. Następnie zwracam tylko wyniki, które mają numer rowNum, który jest mniejszy lub równy 2. Jeśli chciałbyś zwrócić 3 losowe wiersze, po prostu zmieniłbyś go na mniejszy lub równy 3 i tak dalej.

SELECT entry_id, 
     category, 
     rating 
FROM (SELECT @currank := IF(@category = category, @currank + 1, 1) AS rowNum, 
       @category := category         AS categoryVar, 
       e1.* 
     FROM (SELECT *, 
         (SELECT @currank := 0) r 
       FROM entries 
       ORDER BY category, 
          Rand()) AS e1)AS e2 
WHERE rownum <= 2 
ORDER BY category, 
      rating; 

Oto sqlfiddle związek jak ten, który pisał w swoim pytaniu: http://sqlfiddle.com/#!9/bab8e/37/0


Należy pamiętać, że to samo zapytanie może być łatwo dostosowany do powrotu określoną liczbę rekordów, które nie są losowy. Na przykład, jeśli chcesz, aby powrócić top 5 rating s od każdego category można zmienić

ORDER BY category,rand()

do

ORDER BY category, rating DESC

i zmieniając

WHERE rownum <= 2
do

WHERE rownum <= 5

Powiązane problemy