如何在MySQL连接查询中使用IF语句?
我有一个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
为什么?
以这种方式,您不能在SELECT
中使用IF THEN ELSE END IF
-材质。但是,您可以在存储过程和函数中使用它。
我会JOIN
u.id
既m.user1ID
和m.user2ID
,并使用DISTINCT
以避免重复。
有一个IF()
,你可以在SELECT中使用,但你不能用IF()
做流量控制。
使用此查询:
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。这可能对您有所帮助。
指定条件为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
谢谢,这两个查询生成的结果数量正确,但奇怪地返回NULL的所有值在' otherUser'列。它似乎没有检测到用户的名字,如http://goo.gl/jg7xp – 2012-04-08 17:32:27
这是一个左外连接,所以它似乎不满足任何行的条件。我已经简单地复制了粘贴来自原始查询的条件。再看看,我发现条件有问题 - u.id m.user2ID和u.id = m.user2ID。现在,这永远不会是真的!其他条件也不太可能,尽管不是不可能的。请再次检查您的条件。只需使用此答案作为模板并插入正确的条件即可。 – Dojo 2012-04-08 17:39:41
如果查询适用于已更改的条件,请编辑我的答案并更改条件,以便稍后发生此事的人员获益 – Dojo 2012-04-08 17:44:00
感谢, 它为我工作。人试图类似如下:
**
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。唯一的特例是处理四分之一频率。
谢谢,这个查询生成的结果数量正确,但奇怪地返回NULL在otherUser列中的所有值。它似乎没有检测到用户的名字,如下所示http://goo.gl/jg7xp – 2012-04-08 17:40:11