2010-02-06 14 views
5

Ho un database MYSQL5 e PHP 5. Ho bisogno di una query per una pagina di indice di siti web di giochi che seleziona solo i primi 12 di ogni categoria di giochi. Ecco cosa ho finora.Query SQL avanzata. Top 12 di ogni categoria (MYSQL)

$db->query("SELECT * FROM `games` WHERE status = 'game_published' AND `featured` = '1' ORDER BY `category`"); 

Il codice php raggruppa quindi i giochi della stessa categoria e li visualizza. Ma sì, non limita il numero di giochi di ogni categoria come voglio.

Qui è esattamente ciò che la struttura della tabella assomiglia: i49.tinypic.com/aysoll.png

Ecco un post che suona come quello che sto cercando di fare: http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit) ma non posso dargli un senso.

Qualsiasi aiuto è apprezzato.

risposta

1

Che ne dici di questo?

SELECT * FROM (
    SELECT 
     games.*, 
     @rn := CASE WHEN @category=category THEN @rn + 1 ELSE 1 END AS rn, 
     @category := category 
    FROM games, (SELECT @rn := 0, @category := NULL) AS vars 
    WHERE status = 'game_published' AND featured = '1' 
    ORDER BY category 
) AS T1 
WHERE rn <= 12 
+0

Alcune delle altre soluzioni funzionano ma penso che questo sia il migliore. Grazie. – Neddy

0

Per utilizzare la tecnica dai post che hai citato, è necessario un modo per ordinare i giochi. Stanno usando la data dell'articolo. Quindi selezionano il numero di articoli precedenti per quella società e dicono che non possono essere più di tre.

Se il vostro tavolo da gioco ha una colonna a incremento automatico chiamato id, è possibile selezionare i primi 10 giochi per categoria come:

SELECT * 
FROM  games g1 
WHERE status = 'game_published' 
     AND featured = '1' 
     AND 10 > 
     (
     SELECT COUNT(*) 
     FROM  games g2 
     WHERE g2.status = 'game_published' 
        AND g2.featured = '1' 
        AND g1.category = g2.category 
        AND g2.id > g1.id 
     ) 

La condizione where dice che non ci possono essere più di 10 righe con la stessa categoria e un ID più alto.

+0

Ah, non ha seguito il link dell'articolo. Questo sarebbe il modo più elegante - ma forse più mentalmente deformante - per farlo. –

0

Potrebbe esserci una soluzione più elegante, ma è sufficiente eseguire una query per ogni categoria. In primo luogo ottenere un elenco di categorie:

SELECT DISTINCT(category) FROM `games`; 

Poi prendere ciascuno dei risultati e query per 12 righe:

SELECT * FROM games WHERE status = 'game_published' 
AND `featured` = '1' AND `category` = $category LIMIT 12; 

Naturalmente è necessario aggiungere una sorta di classifica di fila (e l'ordine da essa) per ottenere il superiore 12.

Nota: ci può essere un modo per farlo con una singola query, ma mi sfugge in questo momento.

1

si potrebbe usare UNION, se non stiamo parlando di milioni di tipi di ...

pseudoSQL:

(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 
UNION 
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 
UNION 
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10) 

Se si dispone di serie di categorie in PHP/ASP, è può generare questa unione al volo.

Più: http://dev.mysql.com/doc/refman/5.0/en/union.html

EDIT: Ecco probabilmente risorsa più utile: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

usarlo bene ^^

Problemi correlati