You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过另一MySQL表的ID获取用户表用户名(PHP OOP PDO)

问题:如何通过表关联查询显示收藏指定歌曲的用户名而非用户ID?

现有三个数据表:

  • users:包含users_id(用户ID)、users_uid(用户名)
  • songs:包含song_id(歌曲ID)、song_track(歌曲名)
  • Favorites:包含users_id、song_id,作为用户和歌曲的关联表,已正确关联users表的users_id

目前已实现收藏插入功能,但在网页上显示收藏指定song_id的用户时,只能输出users_id,需要改为显示对应的users_uid。现有PHP OOP PDO代码如下:

class Test extends Dbh {

public function getUsersStmt($songidfav) {
    $sql = "SELECT * FROM Favorites WHERE song_id = ?";
    $stmt = $this->connect()->prepare($sql);
    $stmt->execute([$songidfav]);
    $names = $stmt->fetchall();

    foreach ($names as $name) {
      echo $name['users_id'] . '<br>';
    }
  }
}

调用代码:

$testObj = new Test();
$testObj->getUsersStmt("1");

解决方案:使用JOIN关联表查询

步骤1:修改SQL查询语句

通过JOIN将Favorites表和users表关联,直接查询目标字段users_uid:

SELECT u.users_uid FROM Favorites f JOIN users u ON f.users_id = u.users_id WHERE f.song_id = ?

这里利用两张表的users_id建立关联,只查询需要的用户名字段,减少冗余数据。

步骤2:更新PHP代码逻辑

调整getUsersStmt方法,适配新的查询结果:

class Test extends Dbh {

public function getUsersStmt($songidfav) {
    // 修改后的关联查询SQL
    $sql = "SELECT u.users_uid FROM Favorites f JOIN users u ON f.users_id = u.users_id WHERE f.song_id = ?";
    $stmt = $this->connect()->prepare($sql);
    $stmt->execute([$songidfav]);
    // 直接获取单列结果数组,简化遍历
    $userNames = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);

    foreach ($userNames as $userName) {
      echo $userName . '<br>';
    }
  }
}

补充说明

  • 使用内连接(JOIN)可确保只返回在users表中有对应记录的收藏用户,避免无效数据。
  • 若需同时获取用户ID和用户名,可修改SELECT语句为SELECT u.users_id, u.users_uid,遍历输出时取$name['users_uid']即可。
  • PDO::FETCH_COLUMN参数能直接返回单列数据数组,提升代码效率。

内容的提问来源于stack exchange,提问作者Santospirito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:31:24