18

条件に応じてさまざまな方法でテーブルを結合する SQL クエリがあります。

SELECT m.id, u.first_name AS otherUser
FROM matches AS m
IF (u.id=m.user2ID)
    LEFT JOIN users AS u ON u.id = m.user1ID
ELSE
    LEFT JOIN users AS u ON u.id = m.user2ID
ENDIF
WHERE m.user1ID=2 OR m.user2ID=2

matches整数列 user1ID および user2ID を持つテーブルです。users私のWebアプリケーションのユーザーを含むテーブルです。usersと呼ばれる VARCHAR フィールドがありfirst_nameます。

このクエリの目的は、現在のユーザーと一致するユーザーの名前を取得することです。

ただし、MySQL は次のエラーを返します。

#1064 - You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for 
the right syntax to use near 'IF (u.id=m.user2ID) LEFT JOIN users 
AS u ON u.id = m.user1ID ELSE LEFT JOIN user' at line 3

なんで?

4

5 に答える 5

13

ON 句の一部として条件を指定します。

SELECT m.id, u.first_name AS otherUser
FROM matches AS m
LEFT JOIN users AS u ON (u.id=m.user2ID and u.id = m.user1ID) or (u.id<>m.user2ID and u.id = m.user2ID) 
WHERE m.user1ID=2 OR m.user2ID=2

同じことを行う別の方法:

SELECT m.id, u.first_name AS otherUser
FROM matches AS m
LEFT JOIN users AS u ON IF(u.id=m.user2ID,u.id = m.user1ID,u.id = m.user2ID) 
WHERE m.user1ID=2 OR m.user2ID=2
于 2012-04-08T16:41:19.257 に答える
0

IF THEN ELSE END IFこのように-stuff を aで使用することはできませんSELECT。ただし、ストアド プロシージャおよび関数で使用することはできます。

重複を避けるために、andJOIN u.idと の両方を使用します。m.user1IDm.user2IDDISTINCT

SELECT で使えるがありIF()ますが、 ではフロー制御ができませんIF()

于 2012-04-08T16:07:35.463 に答える
0

LEFT JOINこのように同じテーブルに2 つを並べることもできます。

LEFT JOIN users AS u ON u.id = m.user1ID
LEFT JOIN users AS u2 ON u2.id = m.user2ID

これは、IF ステートメントを使用する代わりの方法です。

于 2018-08-07T09:07:39.500 に答える