2010-02-06 6 views
5

J'ai une base de données MYSQL5 et PHP 5. J'ai besoin d'une requête pour une page d'index de sites de jeux qui ne sélectionne que les 12 premiers de chaque catégorie de jeux. Voici ce que j'ai jusqu'ici.Requête SQL avancée. Top 12 de chaque catégorie (MYSQL)

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

Le code php regroupe ensuite les jeux de la même catégorie et les affiche. Mais ouais ça ne limite pas le nombre de jeux de chaque catégorie comme je le veux.

Voici exactement ce que la structure de la table ressemble à: i49.tinypic.com/aysoll.png

Voici un blog qui ressemble à ce que je suis en train de faire: http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit) Mais je ne peux pas donner un sens à cela.

Toute aide est appréciée.

Répondre

1

Que pensez-vous de cela?

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

Certaines des autres solutions fonctionnent mais je pense que c'est le meilleur. Merci. – Neddy

0

Pour utiliser la technique des messages que vous mentionnez, vous avez besoin d'un moyen de commander les jeux. Ils utilisent la date de l'article. Ensuite, ils choisissent le nombre d'articles plus anciens pour cette entreprise, et disent qu'il ne peut y avoir plus de trois.

Si votre table de jeux a une colonne auto-incrément appelé id, vous pouvez sélectionner les 10 premiers jeux par catégorie comme:

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 condition where dit qu'il ne peut y avoir plus de 10 lignes avec la même catégorie et un ID supérieur.

+0

Ah, ne pas suivre le lien de l'article. Ce serait le moyen le plus élégant - mais peut-être plus déformant mentalement - de le faire. –

0

Il peut y avoir une solution plus élégante, mais vous pouvez simplement exécuter une requête pour chaque catégorie. Tout d'abord obtenir une liste des catégories:

SELECT DISTINCT(category) FROM `games`; 

Ensuite, prenez chacun des résultats et requête pour 12 lignes:

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

Bien sûr, vous devez ajouter une sorte de classement rangée (et l'ordre par celui-ci) pour obtenir le haut 12.

Remarque: il peut y avoir un moyen de le faire avec une seule requête, mais il me échappe pour le moment.

1

vous pouvez utiliser UNION, si nous ne parlons pas de millions de types ...

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) 

Si vous avez des catégories tableau dans votre PHP/ASP, vous peut générer cette union à la volée.

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

EDIT: Voilà sans doute la ressource la plus utile: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Utilisez bien ^^