sql >> データベース >  >> RDS >> Mysql

MySQL:結合パラメータとしてCASE/ELSE値を使用します

    ドキュメント から エイリアスについて:

    結合でエイリアスを使用することはできません。上記の場所でのみご利用いただけます。その理由は、結合の結果のフィールドにエイリアスが存在するためです。定義内でこれらのエイリアスへの結合が許可された場合、再帰的定義になります(または可能性があります)。

    問題を解決するには、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
    

    ただし、おそらくこのクエリを2つの選択として書き直し、それらを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);
    



    1. SQLServerのメッセージ241「文字列から日付や時刻を変換するときに変換に失敗しました」を修正

    2. MySQLデータベースの最大テーブルサイズ

    3. MySQLでのOCT()関数のしくみ

    4. 別のMySQL自動インクリメント列を作成するにはどうすればよいですか?