Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / DISTINCT на два поля или вывод списка диалогов / 18 сообщений из 18, страница 1 из 1
27.12.2013, 07:45:43
    #38513815
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Добрый день!
Хочу вывести список диалогов между пользователями одним запросом(если возможно такое конечно)
Есть таблица сообщений:
Код: plaintext
msg_id, from_uid, to_uid, content, dt

Ни как не могу придумать запрос, чтобы вывести все диалоги.

Скорее всего вопрос уже ясен, но для наглядности уточню:
Таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
1, 1, 2, "Привет! Я пользователь номер 1", "2013-12-26 10:00"
2, 2, 1, "Да, добрый вечер!", "2013-12-26 11:00"
3, 1, 2, "Как настроение?", "2013-12-26 12:00"
4, 2, 1, "Лучше всех!", "2013-12-26 13:00"
5, 1, 3, "Здарова!", "2013-12-26 14:00"
6, 3, 1, "И Вам не хворать...", "2013-12-26 10:00"
7, 4, 1, "Трям", "2013-12-26 19:00"

Авторизован пользователь с uid=1
Вот из такого странного диалога, необходимо выцедить некий DISTINCT по двум полям:
Результат:
Код: plaintext
1.
2.
2,
3,
7,

Т.е. список диалогов(или как в 7-й строчке, без ответа - монологов)
...
Рейтинг: 0 / 0
27.12.2013, 07:47:43
    #38513816
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
//Не нашел как редактировать сообщение.
Небольшая поправка:

Результат:
Код: plaintext
1.
2.
2,
3,
4,
...
Рейтинг: 0 / 0
27.12.2013, 08:01:38
    #38513823
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Добавлю сложности:
Нужно выводить диалоги в хронологическом порядке
Возможно на уровне SQL и не решить... Хотя конечно надеюсь, местные гуру подскажут :)
...
Рейтинг: 0 / 0
27.12.2013, 08:22:03
    #38513829
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Pavel KuznetsovРезультат:
Код: plaintext
1.
2.
2,
3,
4,
а сообщение "1 почему не в списке?
...
Рейтинг: 0 / 0
27.12.2013, 08:42:38
    #38513844
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
tanglirPavel KuznetsovРезультат:
Код: plaintext
1.
2.
2,
3,
4,
а сообщение "1 почему не в списке?

Чтобы не выводить диалог с самим собой. Но можно опустить это (проще на PHP будет убрать)
...
Рейтинг: 0 / 0
27.12.2013, 08:48:45
    #38513851
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Pavel KuznetsovЧтобы не выводить диалог с самим собой
Pavel Kuznetsov
Код: plaintext
msg_id,  from_uid, to_uid 

Pavel Kuznetsov
Код: plaintext
1,  1, 2 

где тут "диалог с самим собой"?
...
Рейтинг: 0 / 0
27.12.2013, 09:02:04
    #38513858
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Pavel KuznetsovАвторизован пользователь с uid=1


На самом деле первая строчка выведена - результата - 2
Задача стоит чтобы вывести все уникальные from_uid и to_uid
В данном примере мы не выводим диалог с пользователем uid=1
А вот диалоги остальных пользователей нам нужно вывести.
...
Рейтинг: 0 / 0
27.12.2013, 09:14:51
    #38513866
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
авторРезультат:
2,
3,
7,
Важно уточнее(каюсь забыл) - это uid (либо from_, либо to_)
...
Рейтинг: 0 / 0
27.12.2013, 09:37:07
    #38513889
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Т.е. вывести список уникальных веток между пользователями.
Или по другому "Список контактов" (которые отправляли мне сообщения, либо которым я отправлял)
...
Рейтинг: 0 / 0
27.12.2013, 09:38:56
    #38513892
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
ну и чё? тривиальнейшая же задачка...
Код: sql
1.
2.
3.
4.
select * 
from messages
where (from_uid, to_uid) in ((1,2), (2,1))
order by dt



Pavel KuznetsovВозможно на уровне SQL и не решить...
А Вы попробуйте не кидаться словами сразу, а сперва хоть что-нибудь почитать про то, за что хватаетесь...
...
Рейтинг: 0 / 0
27.12.2013, 09:53:40
    #38513906
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Akinaну и чё? тривиальнейшая же задачка...
Код: sql
1.
2.
3.
4.
select * 
from messages
where (from_uid, to_uid) in ((1,2), (2,1))
order by dt



Немного не понял откуда цифры 1 и 2? Если 1 - это UID авторизованного пользователя, то что означает 2 ?

Изначально было следующее решение у меня. И оно отрабатывает на 75% необходимого результата:
Код: sql
1.
2.
3.
4.
select distinct
    least(from_uid, to_uid) as v1
  , greatest(to_uid, from_uid) as v2
from messages


НО! не получается сортировать по дате...

AkinaPavel KuznetsovВозможно на уровне SQL и не решить...
А Вы попробуйте не кидаться словами сразу, а сперва хоть что-нибудь почитать про то, за что хватаетесь...
Я на форумах задаю вопрос очень редко (не чаще раза в год) и только после чтения доков и форумов. Вы же сами в свою очередь не зная меня и как я пытался решить свой вопрос, "бросили" слова о том, что я не читал "про то, за что хватаюсь"...
...
Рейтинг: 0 / 0
27.12.2013, 10:04:00
    #38513920
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Pavel KuznetsovЗадача стоит чтобы вывести все уникальные from_uid и to_uidПочему тогда именно запись №3, а не №1? До сих пор неясно, что же вы хотите получить.
Pavel KuznetsovВ данном примере мы не выводим диалог с пользователем uid=1
А вот диалоги остальных пользователей нам нужно вывести.У вас во всех исходных записях пользователь 1 присутствует. Следовательно, результатом запроса, выполняющего задачу "вывести диалоги всех пользователей, кроме первого", на приведённых данных будет пустое множество. А у вас в результате несколько записей есть, да ещё и с первым юзером. Как это понимать?..
...
Рейтинг: 0 / 0
27.12.2013, 10:10:12
    #38513929
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Запутал я пользователей разными названиями.
Если не смотреть записи после первого сообщения в этом форуме, то вот что нужно:
Вывести список уникальных веток между пользователями.
Или по другому "Список контактов" (которые отправляли мне сообщения, либо которым я отправлял)
Можно в виде хотелки: "Хочу как во ВКонтакте". Т.е. есть список диалогов и соответственно можно выбрать диалог и продолжить его.
...
Рейтинг: 0 / 0
27.12.2013, 12:16:49
    #38514073
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Pavel KuznetsovНемного не понял откуда цифры 1 и 2?Кто-то "в качестве примера" (не будем показывать пальцем) привёл (правда, с ошибкой) пример вывода сообщений для диалога юзеров с ИДами 1 и 2. И теперь удиивляется, что я сделал то же самое? нелогично...
...
Рейтинг: 0 / 0
27.12.2013, 12:18:10
    #38514074
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Второй вариант - хочешь ты одно, а пишешь совершенно второе.
...
Рейтинг: 0 / 0
27.12.2013, 12:42:10
    #38514114
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Всем спасибо!
Вопрос закрыл.

Вот таким решением:
Код: sql
1.
2.
3.
4.
SELECT DISTINCT ON(from_uid+to_uid)mid, messages.*
FROM messages 
where from_uid=4 OR to_uid=4
order by from_uid+to_uid, dt desc 


Прошу извинить за PGSQL
...
Рейтинг: 0 / 0
27.12.2013, 13:36:10
    #38514202
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
Pavel KuznetsovDISTINCT ON(збс! то есть о том, что у вас постгре и можно пользоваться его синтаксическими плюшками, мы тоже должны были догадаться?..
а по сабжу - нужный список ид сообщений достаётся дубовым юнионом:
Код: sql
1.
select to_id ... where from_id=4 union select from_id ... where to_id=4 
...
Рейтинг: 0 / 0
27.12.2013, 14:02:57
    #38514236
Pavel Kuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT на два поля или вывод списка диалогов
tanglirPavel KuznetsovDISTINCT ON(збс! то есть о том, что у вас постгре и можно пользоваться его синтаксическими плюшками, мы тоже должны были догадаться?..
а по сабжу - нужный список ид сообщений достаётся дубовым юнионом:
Код: sql
1.
select to_id ... where from_id=4 union select from_id ... where to_id=4 



Всё еще хуже)) :
Мне это дело нужно было перекинуть в AcitevRecord Yii , по этому решение на MySQL было бы предпочтительнее.

А по ответу на сабж - спасибо!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / DISTINCT на два поля или вывод списка диалогов / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]