18

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

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

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

为什么?

4

5 回答 5

13

将条件指定为 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
于 2012-04-08T16:41:19.257 回答
10

使用此查询:

SELECT m.id, u.first_name AS otherUser FROM 匹配 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 或 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

检查这个来源

还要检查这个MYSQL Inner Join if 语句。它可能对你有帮助。

于 2012-04-08T16:24:20.097 回答
0

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

我会JOIN u.id同时使用 andm.user1ID来避免重复。m.user2IDDISTINCT

有一个IF()可以在 SELECT 中使用,但不能使用IF().

于 2012-04-08T16:07:35.463 回答
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 增加值,这是通过第一个连接条件实现的. 如果频率为每月,则表 1 中的每个月都应映射到表 2。唯一独特的情况是处理四分之一频率。

于 2016-12-07T09:38:53.333 回答
0

你也可以LEFT JOIN像这样在同一张桌子上放两个......

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

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

于 2018-08-07T09:07:39.500 回答