如何根据用户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);
答案 0 :(得分:0)
问题在于,因为您在两个联接中都为users
表添加了别名,所以在users
条件,JOIN
和{{1}中对GROUP BY
的引用}清单不明确或无效。
发件人或收件人您要从SELECT
中使用哪个用户名和头像?
因为您已经SELECT
两次使用不同的别名进行复制,所以需要具体说明正在使用的JOIN
表的哪个副本。
它必须是users
和user_receiver.username
或user_receiver.avatar
和user_sender.username
或全部。此时,对user_sender.avatar
的引用无效,因为没有任何未混叠的users
表被加入。
同样,users
的别名应在users
条件下使用
我不确定您为什么还要执行JOIN
,但是同样的事情也发生了,GROUP BY
引用无效,因为在该表中没有未混淆的users
表加入后,您必须告诉它要使用的用户表副本。
查询应该看起来像这样(我省略了users
,因为不清楚您要完成什么而没有看到一些实际的表数据。
GROUP BY
答案 1 :(得分:0)
为表赋予别名后,就不能再引用原始表名了,必须使用别名。因此users.columnName
是错误的,您必须在所有这些地方适当地使用user_receiver.columnName
或user_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