2015-08-22 5 views
0

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

Вот мой код:

$name=$_GET['name']; 
    $query_get_user_id = "SELECT id from login WHERE email = '".$_SESSION['login_user']."'"; 
    $result_get_userid=$mysqli->query($query_get_user_id); 
    $user_row = mysqli_fetch_array($result_get_userid); 
    $user_id=$user_row['id']; 

    $query_second_user_id = "SELECT id from login WHERE name LIKE '".$name."%'"; 
    $result_second_get_userid=$mysqli->query($query_second_user_id); 
    $user_second_row = mysqli_fetch_array($result_second_get_userid); 
    $second_user_id=$user_second_row['id']; 

    $query_get_all_users ="SELECT DISTINCT sender_id,receiver_id from message WHERE ((sender_id='".$user_id."' AND receiver_id='".$second_user_id."') OR (sender_id='".$user_id."' AND receiver_id='".$second_user_id."')) order by timestamp desc"; 

    $result_get_all_users=$mysqli->query($query_get_all_users); 
    while($retrieve_user_row = mysqli_fetch_array($result_get_all_users)){ 

Вот моя структура таблицы:

enter image description here

enter image description here

ответ

0

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

select * from (
    select m.*, 
     @rn := if(u.id = @prevUserId, @rn+1, 1) rn, 
     @prevUserId := u.id 
    from users u 
    join messages m on u.id in (m.sender_id,m.receiver_id) 
    where u.name like 'name%' 
    order by u.id, timestamp desc 
) t1 where rn = 1 
+0

Спасибо Fuzzy за ваш ответ, но этот запрос не работает. Он показывает сообщение об ошибке - Каждая производная таблица должна иметь свой собственный псевдоним – user3653474

+0

@ user3653474 см. Обновление – FuzzyTree

+0

Извините, Fuzzy, но этот запрос не дает желаемого результата. Я добавил изображение того, что результат я хочу, пожалуйста, посмотрите на него и помогите мне решить мою проблему , – user3653474

0

Извините, что я ошибаюсь, я разработал запрос только для входа в систему пользователя или одного пользователя. Теперь я получаю вашу точку.

Пожалуйста, попробуйте этот обновленный запрос. Я тестировал его на локальной базе данных и работал, как ожидалось.


SELECT * 
FROM message mm 
INNER JOIN 
    (SELECT sender, MAX(createdtime) AS MaxDateTime 
    FROM message 
    WHERE sender IN 
    (select id from user where name like 'search_filter%') 
    GROUP BY sender) groupedmm 
ON mm.sender = groupedmm.sender 
AND mm.createdtime = groupedmm.MaxDateTime; 
+0

Спасибо Shahid, но этот запрос не работает – user3653474

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