2010-05-03 24 views
11

我試圖根據誰是付款人或收款人,將用戶表中的NAME和PHOTO加入到TRANSACTIONS表中。它一直告訴我找不到表格this - 我做錯了什麼?MySQL:使用CASE/ELSE值作爲連接參數

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 

回答

15

documentation有關別名:

別名用作表達式的列名,並且可以在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); 
+4

你是炸彈!你只是簡單的炸彈!你應該改變你的名字。 :) 謝謝! – DRJ 2010-05-04 09:25:39

+1

@DRJ:不客氣! – 2010-05-04 12:32:07