2010-05-03 12 views
11

J'essaie de joindre la table NAME et PHOTO from USERS à la table TRANSACTIONS en fonction de qui est le payeur ou le bénéficiaire. Il ne cesse de me dire ne peut pas trouver la table this - Qu'est-ce que je fais mal?MySQL: Utiliser la valeur CASE/ELSE comme paramètre de jointure

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 

Répondre

15

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); 
+4

Vous êtes la BOMBE! Vous êtes simplement LA BOMBE! Vous devriez changer votre nom. :) Merci! – DRJ

+1

@DRJ: Vous êtes les bienvenus! –