внутреннее соединение MySQL PHP - PullRequest
0 голосов
/ 25 октября 2018

Как я могу выбрать имя пользователя, аватар и т. Д. На основе идентификатора пользователя из таблицы пользователей без фатальной ошибки: Uncaught 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 голосов
/ 25 октября 2018

Когда вы даете псевдоним таблице, вы больше не можете ссылаться на исходное имя таблицы, вы должны использовать псевдоним.Так что 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
0 голосов
/ 25 октября 2018

Проблема в том, что из-за того, что вы связали таблицу users в обоих соединениях, ссылка на users в условиях JOIN, списки 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, потому что неясно, что вы пытаетесь сделать с этим, не видя какой-то реальной таблицы)данные.

SELECT pm.receiver, pm.date_sent, pm.unread, 
    user_receiver.username AS receiver_name, 
    user_receiver.avatar AS receiver_avatar,
    user_receiver.session_id AS receiver_session_id,
    user_sender.username AS sender_name, 
    user_sender.avatar AS sender_avatar,
    user_sender.session_id AS sender_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 
...