【发布时间】:2011-10-09 14:51:41
【问题描述】:
我现在遇到了一个有趣的困境。我有一个如下的数据库架构:
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 的别名。
我需要的是一个 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 |
| ... | ... | ... | ... | ... |
+-------+----------+-----------+------------+--------------------------------+
请注意,我想要“新 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 的别名。如果递归别名是不可能的,那么我可以开发我的应用程序逻辑来防止它们。
【问题讨论】: