2010-02-06 2 views
5

У меня есть база данных MYSQL5 и PHP 5. Мне нужен запрос для индексной страницы веб-сайтов игр, в которой выбираются только первые 12 из каждой категории игр. Вот что я до сих пор.Расширенный SQL-запрос. Топ 12 из каждой категории (MYSQL)

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

Код php затем группирует игры из одной категории вместе и отображает их. Но да, это не ограничивает количество игр из каждой категории, как я хочу.

Вот именно то, что структура таблицы выглядит следующим образом: i49.tinypic.com/aysoll.png

Вот блог, который звучит как то, что я пытаюсь сделать: http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit) Но я не могу понять это.

Любая помощь приветствуется.

ответ

1

Как насчет этого?

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

Некоторые из других решений работают, но я думаю, что это лучшее. Благодарю. – Neddy

0

Чтобы использовать технику из сообщений, которые вы указываете, вам нужен способ заказать игры. Они используют дату статьи. Затем они выбирают количество старых статей для этой компании и говорят, что их не может быть больше трех.

Если таблица игры имеет столбец автоинкрементируемого под названием id, вы можете выбрать 10 лучших игр в категории, такие как:

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 
     ) 

условие where говорит, что не может быть более 10 строк с той же категории и более высокого идентификатора.

+0

Ах, не по ссылке в статье. Это было бы более изящным, но, возможно, более разумным, способом сделать это. –

0

Может быть более элегантное решение, но вы можете просто выполнить запрос для каждой категории. Сначала получите список категорий:

SELECT DISTINCT(category) FROM `games`; 

Затем возьмите каждый из результатов и запроса для 12 строк:

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

Конечно вам нужно добавить какой-то рейтинг строки (и порядок ею) чтобы получить сверху 12.

Примечание: Там может быть способ сделать это с помощью одного запроса, но она ускользает от меня в данный момент.

1

вы могли бы использовать UNION, если речь не идет о миллиона видов ...

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) 

Если у вас есть массив категорий в вашем PHP/ASP, вы может сгенерировать этот союз «на лету».

Подробнее: http://dev.mysql.com/doc/refman/5.0/en/union.html

EDIT: Вот, наверное, самый полезный ресурс: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Используйте это хорошо ^^