我现在有一个有趣的困境。我有一个数据库架构如下所示:在SQL中合并行中的相似ID?
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 |
| ... | ... |
+----------+-----------+
根据门店是否使用游戏相同的标题有可能是没有问题的,或者同一游戏可以有多个行。别名表存在解决此问题,通过说明id 2和id 3只是id 1的别名。
我需要的是一个SQL查询,它同时使用GameList表和GameAlias表并返回以下内容:
ConglomerateGameList:
+-------+----------+-----------+------------+--------------------------------+
| id | steam_id | origin_id | impulse_id | game_title |
+-------+----------+-----------+------------+--------------------------------+
| 1 | 17450 | 138994900 | dragonage | Dragon Age: Origins |
| 4 | 47850 | 201841300 | fifamgr11 | FIFA Manager 11 |
| ... | ... | ... | ... | ... |
+-------+----------+-----------+------------+--------------------------------+
请注意,我想要“新身份证”的游戏标题。任何“老ids”的游戏标题都应该简单地放弃/忽略。
我也想指出,我不能做任何修改的游戏列表表来解决这个问题。如果我只是重新写表每天晚上看起来像我那么所需的输出,当我抓住从它会无法在数据库中找到游戏中的商店的更新游戏列表,产生又喜欢另一行这样:
+-------+----------+-----------+------------+--------------------------------+
| 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将永远不会改变。如果
奖励积分它可以识别递归的别名,如下所示:
GameAlias:
+----------+-----------+
| old_id | new_id |
+----------+-----------+
| 2 | 1 |
| 3 | 2 |
| ... | ... |
+----------+-----------+
由于ID 3是用于ID 2的别名,其本身是用于ID 1的别名如果递归别名是不可能的话,我可以只是开发我的应用程序逻辑来防止它们。
工作就像一个魅力。事实上,我找到了一种简化查询的方法,使用'COALESCE()'从别名表或原始ID(如果没有别名)返回ID。虽然'group by'和'max(gl1.steam_id),max(...'肯定帮了我很多。 – stevendesu