如何在MySQL连接查询中使用IF语句?

时间:2012-04-08 15:59:43

标签: mysql sql

我有一个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有一个名为first_name的VARCHAR字段。

此查询的目的是获取与当前用户匹配的用户名。

但是,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

为什么?

6 个答案:

答案 0 :(得分:10)

将条件指定为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

答案 1 :(得分:6)

使用此查询:

  

SELECT m.id,u.first_name AS otherUser FROM匹配AS m LEFT   JOIN用户AS u ON u.id = m.user1ID AND u.id = m.user2ID LEFT JOIN用户   AS u1 ON u1.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 u.id = (CASE WHEN u.id=m.user2ID 
                                   THEN m.user1ID
                                   ELSE m.user2ID
                               END)
WHERE m.user1ID=2 OR m.user2ID=2

选中Source

同时检查此MYSQL Inner Join if statement。它可能对你有帮助。

答案 2 :(得分:0)

您不能以IF THEN ELSE END IF方式使用SELECT - 这样的内容。但是,您可以在存储过程和函数中使用它。

JOIN u.id同时使用m.user1IDm.user2ID并使用DISTINCT来避免重复。

您可以在SELECT中使用IF(),但不能使用IF()进行流量控制。

答案 3 :(得分:0)

谢谢, 它对我有用。试过下面的其他事情:

**

Create table TEMP1 (ID INT,T_MONTH INT,T_YEAR INT)
INSERT INTO TEMP1 VALUES(1,1,2001)
INSERT INTO TEMP1 VALUES(2,2,2001)
INSERT INTO TEMP1 VALUES(3,3,2001)

**

CREATE TABLE TEMP2 (T_MONTH INT,T_YEAR INT,FREQUENCY CHAR(1),VAL FLOAT)
INSERT INTO TEMP2 VALUES(1,2001,'M',1.1)
INSERT INTO TEMP2 VALUES(3,2001,'M',1.2)
INSERT INTO TEMP2 VALUES(3,2001,'Q',1.3)
INSERT INTO TEMP2 VALUES(12,2001,'A',1.4)

SELECT * FROM TEMP1 L JOIN TEMP2 H
ON L.T_YEAR = H.T_YEAR
OR (L.T_MONTH = (CASE WHEN H.FREQUENCY='M'
                       THEN H.T_MONTH
                  END)
    OR dbo.GetQuarterFromMonth(L.T_MONTH) = (CASE WHEN H.FREQUENCY = 'Q'
                        THEN dbo.GetQuarterFromMonth(H.T_MONTH)
                        END))
WHERE H.FREQUENCY = 'Q'

此处GetQuarterFromMonth是用户定义的功能,它返回特定月份的Quarter。

上述查询的目的是为表1中的所有月份夸大Quarter的值。如果频率是年度,那么在这种情况下,对于表1的所有月份1-12,该值应该通过第一次加入条件。如果频率是每月,则table1中的每个月应映射到table2。唯一独特的案例是处理季度频率。

答案 4 :(得分:0)

您也可以在同一张桌子上有两个LEFT JOIN,就像这样...

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

这是使用IF语句的替代方法。

答案 5 :(得分:-1)

Image will help you to find the structure of db..

该图像将帮助您查找db的结构。$userId是我们希望查看其朋友列表的用户的Uses ID。

SELECT `connections`.*,`usr`.*,"'.$existImage.'" as main_image_url,"'.$existThumb.'" as thumb_image_url FROM `connections` `connections` JOIN `users` `usr` ON `usr`.`userId` = (CASE WHEN `connections`.`requestBy`="'.$userId.'" THEN connections.requestFor ELSE connections.requestBy END) WHERE `connections`.`requestBy` = "'.$userId.'" OR `connections`.`requestFor` = "'.$userId.'" AND `connections`.`requestStatus` = 1