mysql - 合并 SQL 中相似 ID 的行?

标签 mysql sql subquery alias

我现在遇到了一个有趣的难题。我有一个如下所示的数据库模式:

GameList:
+-------+----------+-----------+------------+--------------------------------+
|  id   | steam_id | origin_id | impulse_id |           game_title           |
+-------+----------+-----------+------------+--------------------------------+
|   1   |   17450  |   NULL    |    NULL    |      Dragon Age: Origins       |
|   2   |   NULL   | 138994900 |    NULL    |    Dragon Age(TM): Origins     |
|   3   |   NULL   |   NULL    |  dragonage |      Dragon Age Origins        |
|   4   |   47850  | 201841300 |  fifamgr11 |        FIFA Manager 11         |
|  ...  |   ...    |    ...    |     ...    |              ...               |
+-------+----------+-----------+------------+--------------------------------+

GameAlias:
+----------+-----------+
|  old_id  |  new_id   |
+----------+-----------+
|    2     |     1     |
|    3     |     1     |
|   ...    |    ...    |
+----------+-----------+

根据商店是否对游戏使用相同的标题,可能没有问题,或者同一游戏可能有多个行。 Alias 表的存在是为了解决这个问题,它声明 id 2 和 id 3 只是 id 1 的别名。

我需要的是一个同时使用 GameList 表和 GameAlias 表并返回以下内容的 SQL 查询:

ConglomerateGameList:
+-------+----------+-----------+------------+--------------------------------+
|  id   | steam_id | origin_id | impulse_id |           game_title           |
+-------+----------+-----------+------------+--------------------------------+
|   1   |   17450  | 138994900 |  dragonage |      Dragon Age: Origins       |
|   4   |   47850  | 201841300 |  fifamgr11 |        FIFA Manager 11         |
|  ...  |   ...    |    ...    |     ...    |              ...               |
+-------+----------+-----------+------------+--------------------------------+

请注意,我要的是“new id”的游戏名称。任何“旧 ID”的游戏名称都应该简单地丢弃/忽略。

我还想指出,我无法对 GameList 表进行任何修改来解决此问题。如果我只是简单地重写表格以使其看起来像我想要的输出,那么每天晚上当我从商店获取更新的游戏列表时,它将无法在数据库中找到该游戏,从而生成另一行,如下所示:

+-------+----------+-----------+------------+--------------------------------+
|  id   | steam_id | origin_id | impulse_id |           game_title           |
+-------+----------+-----------+------------+--------------------------------+
|   1   |   17450  | 138994900 |  dragonage |      Dragon Age: Origins       |
|   4   |   47850  | 201841300 |  fifamgr11 |        FIFA Manager 11         |
|  ...  |   ...    |    ...    |     ...    |              ...               |
|  8139 |   NULL   | 138994900 |    NULL    |     Dragon Age(TM): Origins    |
|  8140 |   NULL   |    NULL   |  dragonage |      Dragon Age Origins        |
+-------+----------+-----------+------------+--------------------------------+

我也不能假设游戏的 ID 永远不会改变,因为众所周知,Steam 会在游戏的重大更新发布时更改它们。

如果它可以识别递归别名,则加分,如下所示:

GameAlias:
+----------+-----------+
|  old_id  |  new_id   |
+----------+-----------+
|    2     |     1     |
|    3     |     2     |
|   ...    |    ...    |
+----------+-----------+

因为 id 3 是 id 2 的别名,它本身是 id 1 的别名。如果递归别名不可能,那么我可以开发我的应用程序逻辑来阻止它们。

最佳答案

这个有用吗?更正表名。

select ga1.new_id, max(gl1.steam_id), max(gl1.origin_id), max(gl1.impulse_id),
max(if(gl1.id = ga1.new_id,gl1.game_title,NULL)) as game_title
from gl1, ga1
where (gl1.id = ga1.new_id OR gl1.id = ga1.old_id)
group by ga1.new_id

union

select gl2.id, gl2.steam_id, gl2.origin_id, gl2.impulse_id, gl2.game_title
from gl2, ga2
where (gl2.id not in (
    select ga3.new_id from ga3
    union
    select ga4.old_id from ga4))

关于mysql - 合并 SQL 中相似 ID 的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7704321/

相关文章:

php - Mysql数据库只进入一次

Java mysql 查询不工作

sql - 在查询中仅使用一列时多列 MySQL 索引的性能

php - 在执行 INSERT 之前,您的 MySQL 是在 JSON 编码之前还是在 JSON 编码之后真正转义数据?

mysql - MySQL 数据透视表中的分组依据

php - 如何避免图片显示在一栏中

sql - 第 2 部分 : how to get the Sum of a partition based query without actually pivoting

MYSQL:不能/如何使用子查询作为完全限定的 CTE

sql - PL/PgSQL 动态子查询

MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表