高级SQL查询。每个类别的前12名(MYSQL)

时间:2010-02-06 23:58:42

标签: php sql mysql database

我有一个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+in+each+group+(group+inner+limit)但我无法理解它。

感谢任何帮助。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

编辑: 这可能是最有用的资源:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

使用得很好^^

答案 2 :(得分: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行具有相同类别和更高ID。

答案 3 :(得分:0)

可能有更优雅的解决方案,但您可以只为每个类别执行查询。首先得到一个类别列表:

SELECT DISTINCT(category) FROM  `games`;

然后取每个结果并查询12行:

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

当然,您需要添加某种排名行(并按顺序排列)以获得顶部 12。

注意:可能有一种方法可以通过单个查询执行此操作,但此刻它让我感到不安。