Как использовать оператор 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