2010-05-03 35 views
11

Tôi đang cố gắng tham gia NAME và PHOTO từ bảng USERS vào bảng TRANSACTIONS dựa trên ai là người thanh toán hoặc người nhận thanh toán. Nó tiếp tục nói với tôi không thể tìm thấy bảng this - Tôi đang làm gì sai?MySQL: Sử dụng giá trị CASE/ELSE làm tham số

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 

Trả lời

15

Từ documentation về bí danh:

Các bí danh được sử dụng như tên cột của biểu hiện và có thể được sử dụng trong GROUP BY, ORDER BY, hoặc điều khoản HAVING.

Bạn không thể sử dụng bí danh trong liên kết. Bạn chỉ có thể sử dụng nó ở những nơi được liệt kê ở trên. Lý do là bí danh nằm trên một trường trong kết quả của phép nối. Nếu tham gia được cho phép các bí danh này trong định nghĩa của nó, nó sẽ (hoặc có thể) dẫn đến các định nghĩa đệ quy.

Để giải quyết vấn đề của bạn, bạn có thể lặp lại các khoản CASE ở cả hai nơi:

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 

Tuy nhiên tôi có lẽ sẽ viết lại truy vấn này là hai chọn lựa và UNION họ:

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 

Kết quả:

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

Dữ liệu thử nghiệm:

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

Bạn là BOMB! Bạn chỉ đơn giản là THE BOMB! Bạn nên đổi tên. :) Cảm ơn! – DRJ

+1

@DRJ: Bạn được chào đón! –

Các vấn đề liên quan