我现在遇到了一个有趣的难题。我有一个如下所示的数据库模式:
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/