mysql - SQL 查询将每一行重复 n 次并向其添加来自另一个表的数据

标签 mysql

我有一个 SQL 查询,其结果表包含 700 个用户 ID 和相应的游戏 ID(用户玩的游戏;总共 1000 个游戏)的列表。

一名用户可能玩过不止一款游戏,并且一个游戏 ID 可能与多个用户 ID 相关联。我在数据库中有另一个表,其中包含所有 gameid 及其各自属性的列表。

我希望我的最终结果表如下:第 1 列包含所有 700 个用户 ID(每个用户 ID 重复的次数与与用户关联的游戏 ID 的数量相同),第 2 列包含相应的游戏 ID 和游戏 ID 表中的其他游戏 ID。针对每个用户 ID 的这些其他游戏 ID 应与针对该用户 ID 已放置的游戏 ID 不同。

表1

Userid      Gameid    
1              3    
1              4    
2             63    
2             76    
6             99    
6             63

表2

Gameid     gamename
1           GTA    
2           DOTA    
1000        xyz

结果表

Userid  Gameid       Gamename
1         3          AOE    
1         4          Roadrash    
1         1          GTA    
1         2          DOTA    
1         5          qbc     
so on up to 
1       1000         xyz

表 1 中的所有用户 ID 也是如此。

结果表中每个用户 ID 重复 1000 次,每个用户 ID 的前 n 个 gameid 是表 1 中的游戏 ID(特定用户玩过的游戏),其余的 gameid 来自表 2 中的 1000 个游戏 ID(因此每个用户映射到所有游戏 ID,其中排名靠前的是他们玩过的游戏)。

数据设置的想法是在结果表的末尾包含一列具有二进制值的列(1 -> 用户已经玩过游戏,0 -> 用户还没有玩过游戏)。该表将用于机器学习。

最佳答案

将结果表构建为用户玩过的游戏和用户未玩过的游戏的并集,如下所示:

  select UserId, GameId, GameName, Played
  from (
    -- games played
    select usr.UserId, gme.GameId, gme.GameName, 1 as Played
    from USERS usr
    inner join GAMES gme on usr.GameId = gme.GameId
    union
    -- games not played
    select usr.UserId, gme.GameId, gme.GameName, 0 as played
    from USERS usr, GAMES gme
    where gme.GameId not in (
      select usr2.GameId
      from USERS usr2
       where usr2.UserId = usr.UserId
    )
  )
  order by Userid, Played desc, Gameid

外部选择用于对结果集进行排序,以便首先提供所玩的游戏。

关于mysql - SQL 查询将每一行重复 n 次并向其添加来自另一个表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31441563/

相关文章:

php - 如何使用 SQL UNION 分离 SQL 表的输出?

mysql - SQL 如何将这三个 View 合并为一个?

php - 修复准备好的声明

php - 内连接查询以获取每种武器的结果

mysql - ASP.NET MVC 和 MySQL 作为网站的框架选择

c# - 在 VB.NET 2005 或 C#.NET 2005 中使用多个数据读取器,并以 MySQL 5.0 作为后端

php - 将组合值插入数据库

mysql - MySQL中如何设置表级权限

mysql - mysql慢查询日志中的"COMMIT"与rails应用程序2.3.5

php - 将变量从表单传递到下一页并放入sql语句php