2012-04-08 48 views
8

我有一个SQL查询,根据条件以不同方式连接表。如何在MySQL连接查询中使用IF语句?

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 

为什么?

回答

0

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

我会JOINu.idm.user1IDm.user2ID,并使用DISTINCT以避免重复。

有一个IF(),你可以在SELECT中使用,但你不能用IF()做流量控制。

3

使用此查询:

SELECT m.id, u.first_name AS otherUser FROM matches AS m LEFT JOIN users AS u ON u.id = m.user1ID AND u.id=m.user2ID LEFT JOIN users 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。这可能对您有所帮助。

+0

谢谢,这个查询生成的结果数量正确,但奇怪地返回NULL在otherUser列中的所有值。它似乎没有检测到用户的名字,如下所示http://goo.gl/jg7xp – 2012-04-08 17:40:11

8

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

谢谢,这两个查询生成的结果数量正确,但奇怪地返回NULL的所有值在' otherUser'列。它似乎没有检测到用户的名字,如http://goo.gl/jg7xp – 2012-04-08 17:32:27

+0

这是一个左外连接,所以它似乎不满足任何行的条件。我已经简单地复制了粘贴来自原始查询的条件。再看看,我发现条件有问题 - u.id <> m.user2ID和u.id = m.user2ID。现在,这永远不会是真的!其他条件也不太可能,尽管不是不可能的。请再次检查您的条件。只需使用此答案作为模板并插入正确的条件即可。 – Dojo 2012-04-08 17:39:41

+0

如果查询适用于已更改的条件,请编辑我的答案并更改条件,以便稍后发生此事的人员获益 – Dojo 2012-04-08 17:44:00

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是用户定义的funtion其特定月份返回城区。

上述查询的目的是夸大表1中所有月份的季度价值。如果频率是年度的,那么在这种情况下,应该为表1的所有月份1-12的月份充值通过第一个连接条件。如果频率是每月,则来自table1的每个月应映射到table2。唯一的特例是处理四分之一频率。