2014-10-12 4 views
0

tbl_chat:2 слева соединяется с профсоюзом

message_id message_text users_id another_user time_sent 
1   'hi'    9  1   2014-10-13 00:10:32 
2   'hello'    1  9   2014-10-13 00:12:32 
3   'good morning'  9  1   2014-10-13 00:12:34 
4   'good night'  9  1   2014-10-13 00:14:02 
5   'LOL'    1  9   2014-10-13 00:14:05 

tbl_usersinfo:

users_id users_fname  users_lname 
1   ben    ten 
9   son    goku 

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

SELECT CONCAT_WS(' ',i.users_fname, i.users_lname) AS full_name, c.message_text,c.time_sent,c.message_id 
FROM tbl_chat AS c 
LEFT JOIN tbl_usersinfo AS i ON i.users_id = c.another_user 
WHERE c.users_id = 1 
UNION 
SELECT CONCAT_WS(' ',i.users_fname, i.users_lname) AS full_name, c.message_text,c.time_sent,c.message_id 
FROM tbl_chat AS c 
LEFT JOIN tbl_usersinfo AS i ON i.users_id = c.users_id 
WHERE c.users_id = 9 
ORDER BY time_sent ASC 

результат Thi s запрос будет:

full_name message_text  time_sent    message_id 
son goku 'hi'    2014-10-13 00:10:32  1 
son goku 'hello'   2014-10-13 00:12:32  2 
son goku 'good morning'  2014-10-13 00:12:34  3 
son goku 'good night'  2014-10-13 00:14:02  4 
son goku 'lol'    2014-10-13 00:14:05  5 

но мой желаемый результат:

full_name message_text  time_sent    message_id 
son goku 'hi'    2014-10-13 00:10:32 1 
ben ten  'hello'   2014-10-13 00:12:32 2 
son goku 'good morning'  2014-10-13 00:12:34 3 
son goku 'good night'  2014-10-13 00:14:02 4 
ben ten  'lol'    2014-10-13 00:14:05 5 
+1

Можете ли вы также поделиться (неправильным) выходом, который производит этот запрос? – Mureinik

+0

уверен, подождите .... –

ответ

3
SELECT CONCAT_WS(' ',i.users_fname, i.users_lname) AS full_name, c.message_text,c.time_sent,c.message_id 
FROM tbl_chat AS c 
LEFT JOIN tbl_usersinfo AS i ON i.users_id = c.users_id 
WHERE (c.users_id = 1 AND c.another_user = 9) 
    OR (c.users_id = 9 AND c.another_user = 1) 
ORDER BY time_sent ASC 
+0

Это работает, спасибо broo. :) –

1

Существует небольшая логическая ошибка

SELECT CONCAT_WS(' ',i.users_fname, i.users_lname) AS full_name, c.message_text,c.time_sent,c.message_id 
FROM tbl_chat AS c 
LEFT JOIN tbl_usersinfo AS i ON i.users_id = c.another_user // this is another user so turning 1 to 9 
WHERE c.users_id = 1 
UNION 
SELECT CONCAT_WS(' ',i.users_fname, i.users_lname) AS full_name, c.message_text,c.time_sent,c.message_id 
FROM tbl_chat AS c 
LEFT JOIN tbl_usersinfo AS i ON i.users_id = c.users_id 
WHERE c.users_id = 9 
ORDER BY time_sent ASC 

Чтобы исправить это, вы можете изменить i.users_id = c.another_user для i.users_id = c.users_id, но лучше всего удалить объединение и сохранить запрос простым, как @Rimas указал

SELECT CONCAT_WS(' ',i.users_fname, i.users_lname) AS full_name, c.message_text,c.time_sent,c.message_id 
FROM tbl_chat AS c 
LEFT JOIN tbl_usersinfo AS i ON i.users_id = c.users_id 
WHERE c.users_id in (1,9) AND c.another_user in (1,9) 
+0

работает отлично, спасибо, спасибо! хорошего дня :) –

0

Ну, я не использовал союз или левое соединение, полагая, что userId tbl_chat всегда будет присутствовать в таблице chatinfo. Я получаю правильный вывод, используя следующие,

select concat(users_fname,' ', users_lname), message_text, time_sent , message_id 
from tbl_chat t 
join tbl_usersinfo u 
on u.users_id = t.users_id 
order by message_id 

Основываясь на сценарии, перечисленные в вопросе, это работает, и это будет быстро, потому что его не использует какой-либо союз.

Смежные вопросы