Des documentation sur les alias:
L'alias est utilisé comme nom de colonne de l'expression et peut être utilisé dans GROUP BY, ORDER BY ou HAVING.
Vous ne pouvez pas utiliser un alias dans une jointure. Vous pouvez l'utiliser seulement dans les endroits énumérés ci-dessus. La raison en est que l'alias est sur un champ dans le résultat de la jointure. Si la jointure était autorisée dans ces alias dans sa définition, cela aurait (ou pourrait) entraîner des définitions récursives.
Pour résoudre votre problème, vous pouvez répéter la CASE
clause dans les deux lieux:
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
Cependant, je ne serais probablement réécrire cette requête comme deux sélectionne et UNION eux
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
Résultat:
'name3', 'photo3', 30, 'comment3', 3
'name1', 'photo1', 10, 'comment1', 1
'name2', 'photo2', 20, 'comment2', 2
Données de test:
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);
Vous êtes la BOMBE! Vous êtes simplement LA BOMBE! Vous devriez changer votre nom. :) Merci! – DRJ
@DRJ: Vous êtes les bienvenus! –