问题:我想列出每个类型的 n 个游戏(顺序不重要)
以下 MySQL 查询驻留在 ColdFusion 函数中。它旨在列出一个平台下的所有游戏(例如,列出所有 PS3 游戏;列出所有 Xbox 360 游戏;等等……)。 PlatformID 的变量通过 URL 传递。我有 9 种类型,我想列出每种类型的 10 款游戏。
SELECT
games.GameID AS GameID,
games.GameReleaseDate AS rDate,
titles.TitleName AS tName,
titles.TitleShortDescription AS sDesc,
genres.GenreName AS gName,
platforms.PlatformID,
platforms.PlatformName AS pName,
platforms.PlatformAbbreviation AS pAbbr
FROM
(((games join titles on((games.TitleID = titles.TitleID))) join genres on((genres.GenreID = games.GenreID))) join platforms on((platforms.PlatformID = games.PlatformID)))
WHERE
(games.PlatformID = '#ARGUMENTS.PlatformID#')
ORDER BY
GenreName ASC,
GameReleaseDate DESC
查询结果返回后,我将它们按如下方式在 ColdFusion 中分组:
<cfoutput query="ListGames" group="gName"> (first loop which lists genres)
#ListGames.gName#
<cfoutput> (nested loop which lists games)
#ListGames.tName#
</cfoutput>
</cfoutput>
问题是我只想列出每个类型的 10 个游戏。如果我在 SQL 中设置 50 个“限制”,我将获得 ~ 50 个相同类型的游戏(取决于该类型的游戏数量)。第二个问题是,当每个人只看几个游戏时,我不希望为所有游戏查询数据库造成过载。
正确的做法是什么?
非常感谢!
最佳答案
我有点生疏,所以我确定这里有一些错误和语法错误。 此存储过程应使用您要查找的数据创建一个临时表
CREATE PROCEDURE topbygenre(num INT, platformID INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a INT;
DECLARE cur CURSOR FOR SELECT GenreID FROM genres;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DECLARE first INT DEFAULT 1;
OPEN cur;
REPEAT
FETCH cur INTO a;
IF NOT done THEN
IF first THEN
CREATE TEMPORARY TABLE TopGames
SELECT
games.GameID AS GameID,
games.GameReleaseDate AS rDate,
titles.TitleName AS tName,
titles.TitleShortDescription AS sDesc,
genres.GenreName AS gName,
platforms.PlatformID,
platforms.PlatformName AS pName,
platforms.PlatformAbbreviation AS pAbbr
FROM
(((games join titles on((games.TitleID = titles.TitleID))) join genres on((genres.GenreID = games.GenreID))) join platforms on((platforms.PlatformID = games.PlatformID)))
WHERE
(games.PlatformID = platformID)
AND games.GenreID = a
ORDER BY
GenreName ASC,
GameReleaseDate DESC
LIMIT num;
SET first = 0;
ELSE
INSERT INTO TopGames
SELECT
games.GameID AS GameID,
games.GameReleaseDate AS rDate,
titles.TitleName AS tName,
titles.TitleShortDescription AS sDesc,
genres.GenreName AS gName,
platforms.PlatformID,
platforms.PlatformName AS pName,
platforms.PlatformAbbreviation AS pAbbr
FROM
(((games join titles on((games.TitleID = titles.TitleID))) join genres on((genres.GenreID = games.GenreID))) join platforms on((platforms.PlatformID = games.PlatformID)))
WHERE
(games.PlatformID = platformID)
AND games.GenreID = a
ORDER BY
GenreName ASC,
GameReleaseDate DESC
LIMIT num;
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END
然后每次需要数据的时候执行tihs:
topbygenre(10, '#ARGUMENTS.PlatformID#');
select * from TopGames;
关于sql - 如何将 MySQL 查询结果分解为类别,每个类别都有特定的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394277/