Zamiast iloczynu kartezjańskiego polecam stosować JOIN z warunkami w ON - wówczas zapytanie stanie się bardziej czytelne. No i w teorii bardziej wydajne ;)
Wyciąganie korespondencji między userami polega na sprawdzaniu par nadawca-odbiorca, zatem jeśli chcemy wyciągnąć korespondencję dla pary userów o id 2 i 3 to musimy sprawdzić dwa warunki: 2 jest nadawcą a 3 odbiorcą oraz 3 jest nadawcą a 2 odbiorcą
((message.id_user_m = 3 AND message.id_user = 2) OR (message.id_user_m = 2 AND message.id_user = 3))
W Twoim zapytaniu dodatkowo jest warunek, który nie może zostać spełniony:
user.id = message.id_user && user.id = message.id_user_m
To zadziałałoby tylko wówczas, gdyby user prowadził korespondencję z samym sobą ;)
Jeśli się chce pobrać dane dla obydwu userów równocześnie to warto skorzystać z możliwości łączenia tych samych tabel przy użyciu aliasów:
SELECT users.name, usersm.name as namem FROM users
JOIN users AS usersm
WHERE users.id != usersm.id
Ostatecznie powstał mi taki potwór:
SELECT
user.login, user.premium, user.id, user.imie,
userm.login AS loginm, userm.premium AS premiumm, userm.id AS idm, user.imie AS imiem,
img.img_adres,
imgm.img_adres AS img_adresm,
message.id_user_m, message.id, message.tresc, message.odczyt, message.data_wyslania
FROM user
JOIN message
ON message.id_user = user.id
JOIN user AS userm
ON message.id_user_m = userm.id
JOIN img
ON img.id_user = user.id
JOIN img AS imgm
ON imgm.id_user = userm.id
WHERE (user.ban = 0 AND userm.ban = 0)
AND (img.profil = 1 AND imgm.profil = 1)
AND
((message.id_user_m = 3 AND message.id_user = 2) OR (message.id_user_m = 2 AND message.id_user = 3))
GROUP BY `message`.`id`
ORDER BY `message`.`data_wyslania` ASC
Coś zwraca ;) i na oko nawet w miarę sensownie, ale to musisz już sprawdzić we własnym zakresie.