如何通过另一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
相关产品推荐
相关产品推荐

