2012-12-14 10 views
6

Ho una tabella in MySQL che contiene un nome di colonna category. Sto provando a scrivere una query che restituirà 2 record casuali da ogni category.Recupera un numero arbitrario di righe casuali da ogni categoria 'raggruppa per' in MySQL

Ecco il codice che uso per ottenere 2 record da ciascuna category con i valori più alti della mia rating colonna:

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 

controllare questo link per vedere una tabella con alcuni dati di esempio e l'interrogazione di cui sopra: http://sqlfiddle.com/#!9/bab8e/1

+1

cosa esattamente si richiede. 2 record casuali da ogni categoria giusto ?? o qualcosa del genere, fa riferimento alla query che hai incluso ..!? – Chella

+0

La query è lì solo per mostrare a cosa sto lavorando, diciamo che ho 30 voci in una tabella 10 di ogni categoria, vorrei recuperare 2 voci casuali di ciascuna di queste categorie. Ciò restituirebbe 6 risultati. – Ivar

+0

Dai un'occhiata a questo post: http://stackoverflow.com/questions/984396/how-to-get-mysql-random-integer-range – ntgCleaner

risposta

1

Ho raggiunto i risultati desiderati ordinando la tabella per la colonna della categoria e un numero casuale. Ho quindi assegnato un numero progressivo a ciascuna riga che ricomincia da 1 a ogni volta che la categoria cambiava. Quindi restituisco solo i risultati che hanno una rowNum minore o uguale a 2. Se si desidera restituire 3 righe casuali, si dovrebbe semplicemente cambiarlo in un numero minore o uguale a 3 e così via.

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; 

Ecco un link di sqlfiddle come quello che hai postato nella tua domanda: http://sqlfiddle.com/#!9/bab8e/37/0


Do atto che questa stessa domanda potrebbe essere facilmente adattato per restituire un determinato numero di record che non sono casuale. Ad esempio, se si voleva restituire i primi 5 rating s da ogni category è possibile modificare il

ORDER BY category,rand()

a

ORDER BY category, rating DESC

e cambiando

WHERE rownum <= 2
a

WHERE rownum <= 5

Problemi correlati