Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL连接查询中使用IF语句?_Mysql_Sql - Fatal编程技术网

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

如何在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是一个包含整

我有一个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\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