【问题标题】:Linking 2 IDs to display either one depending on which is being addressed链接 2 个 ID 以显示任一 ID,具体取决于正在寻址的 ID
【发布时间】: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 和年份的子数组的父键,然后我应该以某种方式仅对父键进行排序而不影响子数组,我真的不知道该怎么做那也不值得。总而言之,似乎对数据库和脚本都造成了不必要的压力。

那么这里的最佳解决方案是什么?

【问题讨论】:

  • 是的,我想我可能需要在查询本身中使用等效逻辑,除非我对查询不太擅长,所以我不知道该怎么做,也不知道这是否可能观点。谢谢,我试试看。

标签: php mysql arrays


【解决方案1】:

您有一个与games 表中的游戏相关的id。 您有一个将其他游戏 ID 链接到主游戏 id 的表格 您想显示这些链接游戏和相关信息的列表。

Select lg.*
FROM `games` g
LEFT JOIN `simpairs` s
ON s.first = g.id OR s.second = g.id
JOIN `games` lg // linked games
on lg.id = case when s.first = g.id then s.second else s.first end
where g.id = ?

如果您有任何问题,请告诉我,这很容易解释。虽然它确实假设simpairsfirstsecond 中没有反向重复值,否则您可能需要将它们过滤掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多