2010-05-03 17 views
11

parametresine birleştirme olarak kullanın. USERS tablosundan NAME ve PHOTO'a, ödeme yapan veya alacaklı olan kişi bazında TRANSACTIONS tablosuna katılmaya çalışıyorum. Tabloyu bulamadığımma devam ediyor this - Neyi yanlış yapıyorum? documentation ilgili diğer adlar kaynaktanMySQL: CASE/ELSE değerini

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 

cevap

15

: takma ifadenin sütun adı olarak kullanılır grup tarafından, istek üzerine veya HAVING maddelerde kullanılabilir

.

Birleştirmedeki takma ad kullanamazsınız. Sadece yukarıda listelenen yerlerde kullanabilirsiniz. Bunun nedeni, takma adın bir diğer adıyla bir alan üzerinde olmasıdır. Birleşmenin bu takma adlara tanımında izin verilmiş olsaydı, yinelemeli tanımlarla sonuçlanırdı (ya da olabilir).

sorunu çözmek için, her iki yerde de CASE maddesini tekrar edebilir:

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 

muhtemelen iki seçer olarak bu sorguyu yeniden yazmak ve UNION onları olacağını Ancak:

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 

Sonuç:

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

Test verileri:

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

BOMB'sın! Sadece sadece BOMB'sın! Adını değiştirmelisin. :) Teşekkürler! – DRJ

+1

@DRJ: Rica ederim! –