我有一个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)但我无法理解它。
感谢任何帮助。
答案 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。
注意:可能有一种方法可以通过单个查询执行此操作,但此刻它让我感到不安。