【发布时间】:2021-10-19 00:33:44
【问题描述】:
我有一个游戏数据库,我需要在另一个表中创建一对相似的游戏。所以,假设游戏 ID 5 和 ID 12 需要配对,应该是这样的:
---------------------------
| PairID | First | Second |
---------------------------
| 1 | 5 | 12 |
---------------------------
所以我需要的基本上是加入配对和游戏桌,并根据正在浏览的游戏选择和显示每对的所有 ID 的数据。也就是说,如果是游戏 ID 5,则应显示 ID 12,反之亦然。一开始看起来很简单,但我发现没有最近的优雅解决方案,主要问题是对表中 ID 的顺序。
首先,通过这种方案,我不得不使用“游戏”表的两个单独连接并选择两个游戏的数据,不管这样:
SELECT simpairs.id, simpairs.first, simpairs.second,
games_one.id AS first_id, games_two.id AS sec_id,
games_one.title AS first_title, games_two.title AS sec_title,
games_one.year AS first_year, games_two.year AS sec_year
FROM simpairs
LEFT JOIN games AS games_one ON simpairs.first = games_one.id
LEFT JOIN games AS games_two ON simpairs.second = games_two.id
WHERE simpairs.first = <id> OR simpairs.second = <id>
其次,我需要脚本来挑选并显示正确的数据,如下所示:
$id = $_GET['id'];
while($row = mysqli_fetch_assoc($res)) {
if($row['first_id'] != $id) {
$game_id = $row['first_id'];
$title = $row['first_title'];
$year = $row['first_year'];
} else {
$game_id = $row['sec_id'];
$title = $row['sec_title'];
$year = $row['sec_year'];
}
...
}
好的,所以这已经很混乱了。不过,最大的问题是按字母顺序对输出进行排序。显然,它不能在 SQL 端轻松完成,除非查询以某种方式重建,没有明显的路由,因为它必须包含 PHP 条件的等效项,或者应该修改对表以包含每个镜像对像这样的新条目:
---------------------------
| PairID | First | Second |
---------------------------
| 1 | 5 | 12 |
---------------------------
| 2 | 12 | 5 |
---------------------------
这当然可行,我只需要 1 个连接而不是 2 个,这也可以直接在 SQL 端进行排序,但这看起来也不是很优雅,因为我必须为每个连接执行两次插入新的一对而不是仅仅 1 加上镜像条目使数据库变得混乱,使其正好大 2 倍。我的意思是,如果这是正确的方式,那么我想我可以接受。
在脚本方面对数据进行排序同样令人生畏。通常,数组用于这种场合,但这次我不知道如何有效地实现它。我需要以某种方式存储 ID、游戏名称和发布年份,然后仅根据名称对所有内容进行排序。意思是,我可能应该使用二维数组,其中标题充当包含 ID 和年份的子数组的父键,然后我应该以某种方式仅对父键进行排序而不影响子数组,我真的不知道该怎么做那也不值得。总而言之,似乎对数据库和脚本都造成了不必要的压力。
那么这里的最佳解决方案是什么?
【问题讨论】:
-
是的,我想我可能需要在查询本身中使用等效逻辑,除非我对查询不太擅长,所以我不知道该怎么做,也不知道这是否可能观点。谢谢,我试试看。