2010-02-06 15 views
5

Tengo una base de datos MYSQL5 y PHP 5. Necesito una consulta para una página de índice de sitios web de juegos que solo selecciona los primeros 12 de cada categoría de juegos. Esto es lo que tengo hasta ahora.Consulta SQL avanzada. Top 12 de cada categoría (MYSQL)

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

El código php luego agrupa los juegos de la misma categoría y los muestra. Pero sí, no limita el número de juegos de cada categoría como quiero.

Aquí es exactamente lo que la estructura de la tabla se ve así: i49.tinypic.com/aysoll.png

Este es un blog que suena como lo que yo estoy tratando de hacer: http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit) pero no puedo darle sentido.

Cualquier ayuda es apreciada.

Respuesta

1

¿Qué tal esto?

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

Algunas de las otras soluciones funcionan, pero creo que es la mejor. Gracias. – Neddy

0

Para utilizar la técnica de las publicaciones que mencionas, necesitas una forma de ordenar los juegos. Están usando la fecha del artículo. Luego seleccionan la cantidad de artículos más antiguos para esa compañía y dicen que no pueden haber más de tres.

Si su mesa de juegos tiene una columna de incremento automático llamado id, puede seleccionar los 10 mejores juegos por categorías como:

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 condición where dice que no puede haber más de 10 filas con la misma categoría y una ID más alta.

+0

Ah, no sigue el enlace del artículo. Esa sería la manera más elegante, pero tal vez más absurda, de hacerlo. –

0

Puede haber una solución más elegante, pero solo puede ejecutar una consulta para cada categoría. En primer lugar obtener una lista de categorías:

SELECT DISTINCT(category) FROM `games`; 

Toma luego cada uno de los resultados y las consultas para 12 filas:

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

Por supuesto es necesario agregar algún tipo de clasificación de fila (y el orden por ella) para obtener el superior 12.

Nota: puede haber una manera de hacer esto con una sola consulta, pero se me escapa por el momento.

1

podría utilizar UNION, si no estamos hablando de millones de tipos ...

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 tiene variedad de categorías en su PHP/ASP, puede generar esta unión sobre la marcha.

Más: http://dev.mysql.com/doc/refman/5.0/en/union.html

EDIT: Aquí es probablemente el recurso más útil: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

usarla bien ^^

Cuestiones relacionadas