我有一个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_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 :(得分:10)
将条件指定为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
答案 1 :(得分:6)
使用此查询:
SELECT m.id,u.first_name AS otherUser FROM匹配AS m LEFT JOIN用户AS u ON u.id = m.user1ID AND u.id = m.user2ID LEFT JOIN用户 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。它可能对你有帮助。
答案 2 :(得分:0)
您不能以IF THEN ELSE END IF
方式使用SELECT
- 这样的内容。但是,您可以在存储过程和函数中使用它。
我JOIN
u.id
同时使用m.user1ID
和m.user2ID
并使用DISTINCT
来避免重复。
您可以在SELECT中使用IF()
,但不能使用IF()
进行流量控制。
答案 3 :(得分: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,该值应该通过第一次加入条件。如果频率是每月,则table1中的每个月应映射到table2。唯一独特的案例是处理季度频率。
答案 4 :(得分:0)
您也可以在同一张桌子上有两个LEFT JOIN
,就像这样...
LEFT JOIN users AS u ON u.id = m.user1ID
LEFT JOIN users AS u2 ON u2.id = m.user2ID
这是使用IF语句的替代方法。
答案 5 :(得分:-1)
该图像将帮助您查找db的结构。$userId
是我们希望查看其朋友列表的用户的Uses ID。
SELECT `connections`.*,`usr`.*,"'.$existImage.'" as main_image_url,"'.$existThumb.'" as thumb_image_url FROM `connections` `connections` JOIN `users` `usr` ON `usr`.`userId` = (CASE WHEN `connections`.`requestBy`="'.$userId.'" THEN connections.requestFor ELSE connections.requestBy END) WHERE `connections`.`requestBy` = "'.$userId.'" OR `connections`.`requestFor` = "'.$userId.'" AND `connections`.`requestStatus` = 1