sql >> Database >  >> RDS >> Mysql

MySQL:gebruik CASE/ELSE-waarde als join-parameter

Uit de documentatie over aliassen:

U kunt geen alias gebruiken in een join. U kunt het alleen op de hierboven genoemde plaatsen gebruiken. De reden is dat de alias op een veld staat in het resultaat van de join. Als de join in de definitie van deze aliassen zou worden toegestaan, zou (of zou dit kunnen) leiden tot recursieve definities.

Om uw probleem op te lossen kunt u de CASE . herhalen clausule op beide plaatsen:

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

Ik zou deze query echter waarschijnlijk herschrijven als twee selecties en ze 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

Resultaat:

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

Testgegevens:

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



  1. MijnSQL | REGEXP VS Vind ik leuk

  2. Waarschuwing:mysqli_query() verwacht dat parameter 1 een mysqli boolean is

  3. Genereer SQL om de primaire sleutel bij te werken

  4. hoe sqlite te synchroniseren met Mysql