SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.12.2014 14:21:47

Андрей54321
Участник
Зарегистрирован: 25.12.2014
Сообщений: 4

последние открытые диалоги польз. с другими польз. и с текстом

Доброго времени суток повелителям запросовsmile.
Помогите пожалуйста советом, а лучше рабочим запросом.

Есть таблица обмена сообщениями между пользователями (дамп прикреплен в файле)
Пользователи обмениваются сообщениями, сообщения складываются в примерно такую таблицу
id - автоинкремент
from_id - от пользователя с айди
to_id - к пользователя с айди
message - текст сообщения (<от айди пользователя>-<к айди пользователя> / <айди записи в таблице сообщений> - для наглядности)

id    from_id    to_id        message
26     2           10          2-10 /26
25     10           4         10-4 /25
24     10           2         10-2 /24
23     2          10         2-10 /23
22     10           2         10-2 /22
21     10           2         10-2 /21
19     2          10         2-10 /19
18     11         10         11-10 /18
17     11         10         11-10 /17
16     11         10         11-10 / 16

Логически нужно получить последнии записи открытых диалогов для текущего пользователя с другими пользователями с текстом последнего сообщения

Список открытых диалогов и последних сообщений в них между пользователями
Ожидаемый результат для пользователя id = 10 (from_id = 10 и to_id = 10)

26     2     10     2-10 /26
25     10     4     10-4 /25
18     11     10     11-10 /18

* Заметка:
- 10 не писал 11, но 11 писал 10, и у них открытый диалог
- в случае пар (пользователи обменивались сообщениями, нужно последнее)
26     2     10     2-10 /26
24     10     2     10-2 /24
возвращается запись с большим id
26     2     10     2-10 /26
- нужно что бы верно отдал последее сообщение


Ожидаемый результат для пользователя id = 11
18     11     10     11-10 /18

Ожидаемый результат для пользователя id = 2
26     2     10     2-10 /26

Спасибо, надеюсь на вашу помощь)

Отредактированно Андрей54321 (25.12.2014 14:22:30)


Прикрепленные файлы:
Attachment Icon users_messages.sql, Размер: 1,555 байт, Скачано: 1,204

Неактивен

 

#2 25.12.2014 15:16:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: последние открытые диалоги польз. с другими польз. и с текстом

Неактивен

 

#3 25.12.2014 16:34:22

Андрей54321
Участник
Зарегистрирован: 25.12.2014
Сообщений: 4

Re: последние открытые диалоги польз. с другими польз. и с текстом

не получается избавится от дублирующей пары

отсюда
http://sqlinfo.ru/forum/viewtopic.php?id=7115


SELECT *
    FROM (
            SELECT *
            FROM `users_messages`
            WHERE from_id =10
            OR to_id =10
           ORDER BY id DESC
         ) AS tabl
GROUP BY from_id, to_id
ORDER BY id DESC
 



Результат
26     2     10     2-10 /26
25     10     4     10-4 /25
24     10     2     10-2 /24
18     11     10     11-10 /18

не так, строка лишняя
24     10     2     10-2 /24

http://sqlinfo.ru/forum/viewtopic.php?id=5747
это тоже не совсем то, тут тоже нет пары от кого : кому -> кому : от кого

Отредактированно Андрей54321 (25.12.2014 16:38:10)

Неактивен

 

#4 25.12.2014 16:55:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: последние открытые диалоги польз. с другими польз. и с текстом

Если не хотите менять структуру, как в http://sqlinfo.ru/forum/viewtopic.php?id=7115
то

select max(id) from
(SELECT id, from_id, to_id FROM `users_messages` WHERE from_id =10
union all
SELECT id, to_id, from_id FROM `users_messages` WHERE to_id =10) t
group by from_id;

Неактивен

 

#5 25.12.2014 17:13:19

Андрей54321
Участник
Зарегистрирован: 25.12.2014
Сообщений: 4

Re: последние открытые диалоги польз. с другими польз. и с текстом

я не совсем понял как использовать ваш запрос?
он возвращает одно число 26, мне нужна таблица
если предположить что так


select * from
(SELECT * FROM `users_messages` WHERE from_id =10
union all
SELECT * FROM `users_messages` WHERE to_id =10) t
group by from_id
 


то результат
19     2     10     2-10 /19
25     10     4     10-4 /25
18     11     10     11-10 /18

при том стоки
19     2     10     2-10 /19
не должно быть, должна быть
26     2     10     2-10 /26

Неактивен

 

#6 25.12.2014 17:34:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: последние открытые диалоги польз. с другими польз. и с текстом

MariaDB [test]> select max(id) from
    -> (SELECT id, from_id, to_id FROM `users_messages` WHERE from_id =10
    -> union all
    -> SELECT id, to_id, from_id FROM `users_messages` WHERE to_id =10) t
    -> group by from_id, to_id;
+---------+
| max(id) |
+---------+
|      26 |
|      25 |
|      18 |
+---------+
3 rows in set (0.00 sec)

Зная id нужных строк, можете получить остальные данные или отдельным запросом или через join http://sqlinfo.ru/articles/info/18.html

Неактивен

 

#7 25.12.2014 18:16:18

Андрей54321
Участник
Зарегистрирован: 25.12.2014
Сообщений: 4

Re: последние открытые диалоги польз. с другими польз. и с текстом

Вроде как результат то что нужно

Получился в итоге такой запрос


select * FROM `users_messages` WHERE id IN (
select max(id) as id from
    (SELECT id, from_id, to_id FROM `users_messages` WHERE from_id =10
    union all
    SELECT id, to_id, from_id FROM `users_messages` WHERE to_id =10) t
    group by from_id, to_id )
ORDER BY id DESC
 


возвращает
26     2     10     2-10 /26
25     10     4     10-4 /25
18     11     10     11-10 /18

хорошая статья, через нее попал на ваш форум

большое спасибо за помощь!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson