如何在MySQL连接查询中使用IF语句?
我有一个SQL查询,它根据条件以不同的方式连接表如何在MySQL连接查询中使用IF语句?,mysql,sql,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是一个包含整
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\u 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
为什么?您不能使用
IF-THEN-ELSE END-IF
-在中填充,请按此方式选择。但是,您可以在存储过程和函数中使用它
我将与m.user1ID
和m.user2ID
一起加入u.id
,并使用DISTINCT
避免重复
您可以在SELECTs中使用IF()
,但不能使用IF()
执行流控制使用此查询:
从匹配项中选择m.id、u.first\u name作为otherUser作为m LEFT
以u.id=m.user1ID和u.id=m.user2ID的身份加入用户左加入用户
作为u1.id=m.user2ID上的u1,其中m.user1ID=2或m.user2ID=2
更新的查询:
看看这个
也检查一下这个。这可能会对您有所帮助。指定条件作为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
谢谢,
这对我有用。尝试了以下类似的其他操作:
**
**
这里GetQuarterFromMonth是一个用户定义的函数,它返回特定月份的季度
上述查询的目的是对表1中所有月份的季度值进行膨胀。如果频率为每年一次,则在这种情况下,应在表1的所有月份1-12(通过第一次连接条件实现)中增加该值。如果频率为每月,则应将表1中的每个月映射到表2。唯一独特的情况是处理四分之一频率。您也可以在同一个表上有两个左连接,如下所示
LEFT JOIN users AS u ON u.id = m.user1ID
LEFT JOIN users AS u2 ON u2.id = m.user2ID
这是使用IF语句的另一种选择。谢谢,这两个查询生成的结果数量正确,但奇怪的是,otherUser
列中的所有值都返回NULL。它似乎没有检测到用户的名字,如图所示,它是一个左外连接,因此似乎任何一行都不满足条件。我只是简单地复制粘贴了原始查询中的条件。再看一眼,我发现这些条件有问题——u.idm.user2ID和u.id=m.user2ID。现在那永远不会是真的!另一种情况也不太可能,尽管并非不可能。请再次检查您的情况。只需将此答案用作模板并插入正确的条件。如果查询与更改的条件一起工作,请编辑我的答案并更改条件,以便稍后阅读此答案的人受益。谢谢,此查询生成的结果数量正确,但奇怪的是,otherUser列中的所有值都返回NULL。它似乎没有检测到用户的名字,如图所示
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
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'
LEFT JOIN users AS u ON u.id = m.user1ID
LEFT JOIN users AS u2 ON u2.id = m.user2ID