2016-08-08 3 views
2

У меня есть таблица conversation, которая содержит два идентификатора пользователя как внешние ключи и пользовательскую таблицу, которая содержит данные пользователей. Я хочу написать запрос, который возвращает таблицу conversation, соединенную с таблицей пользователя, но отображающую имя и фамилию пользователя, идентификатор которого не был отправлен в качестве параметра.SQL JOIN с условиями

CREATE TABLE `conversation` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `user_one_id` int(11) NOT NULL, 
    `user_two_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE `user` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `surname` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

Например, у меня есть

Диалог:

id  user_one_id  user_two_id 
1  1    2 

Пользователь:

id  name   surname 
1  userone_name userone_surname 
2  usertwo_name usertwo_surname 

Я хочу, чтобы запрос, который будет возвращать user_two имя и фамилию в присоединиться, а не пользователя один. Мой текущий запрос:

SELECT c.id, c.user_one_id, c.user_two_id, u.name, u.surname * FROM conversation c 
     JOIN user u 
     WHERE c.user_one_id = 1 
     OR c.user_two_id = 1 
     AND IF (c.user_one_id = u.id, c.user_two_id = u.id, c.user_one_id = u.id) 
     GROUP BY c.id 
     ORDER BY c.date DESC; 
+0

Общего GROUP BY правило говорит: Если указано предложение GROUP BY, каждая ссылка столбца в списке SELECT должна либо идентифицировать столбец группировки, либо быть аргументом функции set! – jarlh

ответ

4

[INNER] JOIN должен иметь ON положение. (Я считаю это недостатком, что MySQL позволяет опустить.)

Джойна критерии должен быть: Дай мне пользователь разговора, который не является пользователем 1.

SELECT c.id, c.user_one_id, c.user_two_id, u.name, u.surname 
FROM conversation c 
JOIN user u ON u.id IN (c.user_one_id, c.user_two_id) AND u.id <> 1 
WHERE c.user_one_id = 1 OR c.user_two_id = 1 
ORDER BY c.date DESC; 
+0

Большое спасибо Торстен. Это сработало. – Miles