Расширенный SQL-запрос. Топ 12 из каждой категории (MYSQL) - PullRequest
5 голосов
/ 07 февраля 2010

У меня есть база данных MYSQL5 и PHP 5. Мне нужен запрос для индексной страницы игровых сайтов, которая выбирает только первые 12 из каждой категории игр. Вот что у меня есть.

$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 + в + каждая + группа + (группа + внутренний + предел) Но я не могу понять это.

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

Ответы [ 4 ]

1 голос
/ 07 февраля 2010

вы можете использовать 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

РЕДАКТИРОВАТЬ: Вот, вероятно, наиболее полезный ресурс: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

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

1 голос
/ 07 февраля 2010

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

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 голосов
/ 07 февраля 2010

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

SELECT DISTINCT(category) FROM  `games`;

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

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

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

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

0 голосов
/ 07 февраля 2010

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

Если в вашем игровом столе есть столбец автоинкремента под названием 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 строк с одинаковой категорией и более высоким идентификатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...