sql - 如何将 MySQL 查询结果分解为类别,每个类别都有特定的行数?

标签 sql mysql coldfusion

问题:我想列出每个类型的 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/

相关文章:

java - 如何在 Coldfusion 9 中使用 java 文件?

coldfusion - 不是为我创建的隐式 Getter 和 Setter

mysql - SQL MariaDB 统计每种类型查询 3 个表

sql - Postgresql 查询以在文本字段中搜索多个字符串

php - 问答: Ex- and Import Database values with more than 1 Table in XML

php - 使用 PHP 在 XLS 中编辑数据然后导入到 mySQL

sql - "IN"Sql Server 中的子句限制

sql - 如何为每日备份 SSAS 多维数据集生成或设置唯一名称(使用当前日期)

mysql - 如何在同一 View 中排除基于相等值的行数据?

regex - ColdFusion 正则表达式检测第一个不带图像扩展名的 URL