【问题标题】:Advanced SQL query. Top 12 from each category (MYSQL)高级 SQL 查询。每个类别的前 12 名 (MYSQL)
【发布时间】:2010-02-06 23:58:42
【问题描述】:

我有一个 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) 但我无法理解它。

感谢任何帮助。

【问题讨论】:

    标签: php sql mysql database


    【解决方案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
    

    【讨论】:

    • 其他一些解决方案有效,但我认为这是最好的。谢谢。
    【解决方案2】:

    你可以使用UNION,如果我们不是在谈论百万种类型...

    伪SQL:

    (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

    编辑: 这里可能是最有用的资源:@​​987654322@

    好好利用吧^^

    【讨论】:

      【解决方案3】:

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

      SELECT DISTINCT(category) FROM  `games`;
      

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

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

      当然,您需要添加某种排名行(并按其排序)才能获得 top 12。

      注意:可能有一种方法可以通过单个查询来做到这一点,但我现在没有想到。

      【讨论】:

        【解决方案4】:

        要使用您提到的帖子中的技术,您需要一种订购游戏的方法。他们正在使用文章日期。然后他们选择该公司的旧文章数量,并说不能超过三篇。

        如果您的游戏桌有一个名为 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 条件表示同一类别和更高 ID 的行不能超过 10 行。

        【讨论】:

        • 啊,没看文章链接。那将是更优雅——但也许更让人心烦意乱——的方式。
        猜你喜欢
        • 2012-07-25
        • 2011-06-11
        • 2012-01-12
        • 2014-06-08
        • 2022-01-23
        • 2011-03-09
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多