php MySQL:使用CASE/ELSE值作为连接参数

h5qlskok  于 2022-12-17  发布在  PHP
关注(0)|答案(2)|浏览(75)

我试图根据付款人或收款人将用户表中的NAME和PHOTO连接到TRANSACTIONS表中。它一直告诉我找不到表this--我做错了什么?

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
ttp71kqs

ttp71kqs1#

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);
piok6c0g

piok6c0g2#

SELECT th.id,th.硬币标识,th.硬币系列,cm.硬币标识,cm.当前价格FROM trnx_history th JOIN fmi_coins.coins_markets cm ON cm.硬币标识=(大小写th.硬币系列当1 THEN 1否则2 END)

相关问题