内部加入MySQL PHP

时间:2018-10-24 21:04:38

标签: php sql session pdo

如何根据用户ID从用户表中选择用户名,头像等,而不会出现致命错误:请捕获未捕获的PDOException?

PHP:

$req_pm_list = $sql_connection->prepare('SELECT pm.receiver, pm.date_sent, pm.unread, users.username, users.avatar, users.session_id
    FROM pm
    INNER JOIN users AS user_receiver ON pm.receiver = users.id
    INNER JOIN users AS user_sender ON pm.sender = users.id
    WHERE sender = :id OR receiver = :id 
    GROUP BY users.id 
    ORDER BY date_sent ASC');
$req_pm_list->bindValue(':id', $_SESSION['id']);
$req_pm_list->execute();
$pm_list = $req_pm_list->fetchAll(PDO::FETCH_ASSOC);

2 个答案:

答案 0 :(得分:0)

问题在于,因为您在两个联接中都为users表添加了别名,所以在users条件,JOIN和{{1}中对GROUP BY的引用}清单不明确或无效。

发件人或收件人您要从SELECT中使用哪个用户名和头像? 因为您已经SELECT两次使用不同的别名进行复制,所以需要具体说明正在使用的JOIN表的哪个副本

它必须是usersuser_receiver.usernameuser_receiver.avataruser_sender.username或全部。此时,对user_sender.avatar的引用无效,因为没有任何未混叠的users表被加入。

同样,users的别名应在users条件下使用

我不确定您为什么还要执行JOIN,但是同样的事情也发生了,GROUP BY引用无效,因为在该表中没有未混淆的users表加入后,您必须告诉它要使用的用户表副本。

查询应该看起来像这样(我省略了users,因为不清楚您要完成什么而没有看到一些实际的表数据。

GROUP BY

答案 1 :(得分:0)

为表赋予别名后,就不能再引用原始表名了,必须使用别名。因此users.columnName是错误的,您必须在所有这些地方适当地使用user_receiver.columnNameuser_sender.columnName

如果您始终想从与:id相对应的表中选择列,则可以使用IF函数。如果要选择其他用户的列,只需在这些sender = :id函数中将receiver = :id更改为IF

也不需要GROUP BY,您无需进行任何汇总。

SELECT pm.receiver, pm.date_sent, pm.unread, 
    IF(sender = :id, user_sender.username, user_receiver.username) AS username, 
    IF(sender = :id, user_sender.avatar, user_receiver.avatar) AS avatar,
    IF(sender = :id, user_sender.session_id, user_receiver.session_id) AS session_id
FROM pm
INNER JOIN users AS user_receiver ON pm.receiver = user_receiver.id
INNER JOIN users AS user_sender ON pm.sender = user_sender.id
WHERE sender = :id OR receiver = :id 
ORDER BY date_sent ASC