Как использовать оператор IF в запросе соединения с MySQL?
У меня есть 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
- это таблица, содержащая пользователей моего веб-приложения. 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
Почему?
Ответы
Ответ 1
Укажите условие как часть предложения 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
Ответ 2
Используйте этот запрос:
SELECT m.id, u.first_name AS otherUser FROM соответствует AS m LEFT ПРИСОЕДИНИТЕСЬ к пользователям AS u ON u.id = m.user1ID И u.id = m.user2ID LEFT JOIN пользователи AS u1 ON u1.id = m.user2ID ГДЕ 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 statement. Это может быть полезно для вас.
Ответ 3
Вы не можете использовать IF THEN ELSE END IF
-материал в SELECT
таким образом. Однако вы можете использовать его в хранимых процедурах и функциях.
Я бы JOIN
u.id
с m.user1ID
и m.user2ID
и использовал DISTINCT
, чтобы избежать дублирования.
В SELECT есть IF()
, но вы не можете управлять потоком с помощью IF()
.
Ответ 4
Спасибо,
Это сработало для меня. Пробовал что-то еще, как показано ниже:
**
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, который возвращает Quarter в течение определенного месяца.
Цель вышеуказанного запроса состоит в том, чтобы раздуть значение Квартала за все месяцы в таблице 1. Если частота годовая, тогда в этом случае значение должно быть завышено за все месяцы 1-12 таблицы 1, которое достигается посредством первое условие соединения. Если частота равна Ежемесячно, каждый месяц из таблицы 1 следует сопоставить с таблицей 2. Единственный уникальный случай - обработка четвертной частоты.
Ответ 5
Вы также можете иметь два LEFT JOIN
на одном столе, как это...
LEFT JOIN users AS u ON u.id = m.user1ID
LEFT JOIN users AS u2 ON u2.id = m.user2ID
Это альтернатива использованию операторов IF.
Ответ 6
![Image will help you to find the structure of db..]()
Изображение поможет вам найти структуру db. $userId
- это идентификатор пользователя, для которого мы хотим видеть список друзей.
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