MySQL: используйте значение CASE / ELSE в качестве параметра соединения

Я пытаюсь присоединиться к NAME и PHOTO из таблицы USERS в таблицу TRANSACTIONS на основе того, кто является плательщиком или получателем. Он продолжает говорить мне, что я не могу найти таблицу. Что я делаю неправильно?

 SELECT `name`,`photo`,`amount`,`comment`, ( CASE `payer_id` WHEN 72823 THEN `payee_id` ELSE `payer_id` END ) AS `this` FROM `transactions` RIGHT JOIN `users` ON (`users`.`id`=`this`) WHERE `payee_id`=72823 OR `payer_id`=72823 

Из документации об псевдонимах:

Псевдоним используется как имя столбца выражения и может использоваться в предложениях GROUP BY, ORDER BY или HAVING.

Вы не можете использовать псевдоним в соединении. Вы можете использовать его только в перечисленных выше местах. Причина в том, что псевдоним находится в поле в результате соединения. Если соединение было разрешено для этих псевдонимов в его определении, оно (или могло бы) привести к рекурсивным определениям.

Чтобы решить вашу проблему, вы можете повторить предложение CASE в обоих местах:

 SELECT `name`,`photo`,`amount`,`comment`, ( CASE `payer_id` WHEN 72823 THEN `payee_id` ELSE `payer_id` END ) AS `this` FROM `transactions` RIGHT JOIN `users` ON `users`.`id`= ( CASE `payer_id` WHEN 72823 THEN `payee_id` ELSE `payer_id` END ) WHERE `payee_id`=72823 OR `payer_id`=72823 

Однако я, вероятно, переписал бы этот запрос как два выбора, так и UNION:

 SELECT name, photo, amount, comment, payer_id AS this FROM transactions JOIN users ON users.id = payer_id WHERE payee_id = 72823 UNION ALL SELECT name, photo, amount, comment, payee_id AS this FROM transactions JOIN users ON users.id = payee_id WHERE payer_id = 72823 

Результат:

 'name3', 'photo3', 30, 'comment3', 3 'name1', 'photo1', 10, 'comment1', 1 'name2', 'photo2', 20, 'comment2', 2 

Данные испытаний:

 CREATE TABLE users (id INT NOT NULL, name NVARCHAR(100) NOT NULL, photo NVARCHAR(100) NOT NULL); INSERT INTO users (id, name, photo) VALUES (1, 'name1', 'photo1'), (2, 'name2', 'photo2'), (3, 'name3', 'photo3'), (4, 'name4', 'photo4'); CREATE TABLE transactions (amount INT NOT NULL, comment NVARCHAR(100) NOT NULL, payer_id INT NOT NULL, payee_id INT NOT NULL); INSERT INTO transactions (amount, comment, payer_id, payee_id) VALUES (10, 'comment1', 72823, 1), (20, 'comment2', 72823, 2), (30, 'comment3', 3, 72823), (40, 'comment4', 4, 5);