Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Поиск уникальных значений из нескольких столюцов [2]
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Поиск уникальных значений из нескольких столюцов

Страниц (3): « 1 [2] 3 »
 

16. RickMan - 18 Сентября, 2014 - 14:05:45 - перейти к сообщению
Ну пример того, какой массиы должен получитсья в конце, и чтобы не пришлось по нему пробегаться еще раз в php. Думаю проблема решаемая на уровне запроса.
17. ksedin - 18 Сентября, 2014 - 14:48:32 - перейти к сообщению
RickMan пишет:
Ну пример того, какой массиы должен получитсья в конце, и чтобы не пришлось по нему пробегаться еще раз в php. Думаю проблема решаемая на уровне запроса.


Блин, в голове каша... Вроде все проблемы уже решились) Лучше сейчас реализовать попробую, так легче все понять)
(Добавление)
RickMan пишет:
Ну пример того, какой массиы должен получитсья в конце, и чтобы не пришлось по нему пробегаться еще раз в php. Думаю проблема решаемая на уровне запроса.


Нашел.
Таблица:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. user1 | user2
  3. 1          2
  4. 2          1
  5. 2          1
  6. 1          2
  7.  


Нужно, чтоб только одна строка из них отображалась
18. RickMan - 18 Сентября, 2014 - 16:01:20 - перейти к сообщению
А какая именно? Запрос выдал:
Цитата:
1 2
2 1

Почему именно одна? И какая одна?
19. ksedin - 18 Сентября, 2014 - 16:14:14 - перейти к сообщению
RickMan пишет:
А какая именно? Запрос выдал:
Цитата:
1 2
2 1

Почему именно одна? И какая одна?


Я делаю личные сообщения на сайте, записываю все сообщения в одну таблицу.
На одной странице мне нужно вывести все диалоги, то есть ники тех, с кем обался пользователь.
Цитата:
1 2
2 1


В этом случае снчачала пользователь с id 2 шлет сообщение пользователю с id 1, потом пользователь с id 1 шлет сообщение пользователю с id 2.
По сути, фигурируют лишь два пользователя и мне нужна только одна запись та, у которой время отправки позже, но это просто, главное, чтоб отловить лишь одну запись
20. RickMan - 18 Сентября, 2014 - 16:17:04 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. ... ORDER BY id DESC LIMIT 1;
- если нужно последнее из вот того что получилось то просто добавь это..
21. ksedin - 18 Сентября, 2014 - 16:27:34 - перейти к сообщению
RickMan пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. ... ORDER BY id DESC LIMIT 1;
- если нужно последнее из вот того что получилось то просто добавь это..


Нет, мне нужно все, но по одному
22. Sail - 18 Сентября, 2014 - 16:55:48 - перейти к сообщению
ksedin пишет:
На одной странице мне нужно вывести все диалоги, то есть ники тех, с кем обался пользователь

Так ники, или диалоги?!
В итоге на странице должны быть все последние сообщения, обращенные "мне" (одному пользователю с id === user_id от разных пользователей с id === user2_id)?
Или все последние сообщения, обращенные всем пользователям?
А табличка из первоначального поста точно содержит лишь два поля и просто фиксирует факт наличия сообщения от user2_id к user_id?!
23. ksedin - 18 Сентября, 2014 - 17:45:21 - перейти к сообщению
Sail пишет:

Так ники, или диалоги?!
В итоге на странице должны быть все последние сообщения, обращенные "мне" (одному пользователю с id === user_id от разных пользователей с id === user2_id)?
Или все последние сообщения, обращенные всем пользователям?
А табличка из первоначального поста точно содержит лишь два поля и просто фиксирует факт наличия сообщения от user2_id к user_id?!


Мне нужно, как в ВК, ники. Выведу сам, мне нужно лишь айди выловить.
Разумеется, что таблице содержит больше значений, просто убрал воду и оставил только проблему. Модель таблицы вот:
PHP:
скопировать код в буфер обмена
  1. class Mail extends \Phalcon\Mvc\Model
  2. {
  3.     public $id;
  4.    
  5.     public $sender_user_id;
  6.    
  7.     public $recipient_user_id;
  8.  
  9.     public $text_message;
  10.  
  11.     public $time;
  12. }
24. Panoptik - 18 Сентября, 2014 - 18:09:52 - перейти к сообщению
ну с диалогами тут есть несколько ситуаций
1) вам нужно отобразить список диалогов для конкретного пользователя (того кто сейчас авторизирирован)
2) нужно отобразить сообщения по конкретному диалогу для конкретного пользователя

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

для вывода списков диалогов у меня было примерно такое решение
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.             IF(senderUserId = {$user->id},receiverUserId,senderUserId) dialogUserId, `text`,
  3.             MAX(createdAt) createdAt, isRead
  4.           FROM message
  5.             WHERE (senderUserId = {$user->id} OR receiverUserId = {$user->id})
  6.             GROUP BY dialogUserId
  7.             ORDER BY createdAt DESC
  8.             LIMIT 10
25. ksedin - 18 Сентября, 2014 - 18:30:56 - перейти к сообщению
Panoptik пишет:
ну с диалогами тут есть несколько ситуаций
1) вам нужно отобразить список диалогов для конкретного пользователя (того кто сейчас авторизирирован)
2) нужно отобразить сообщения по конкретному диалогу для конкретного пользователя

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

для вывода списков диалогов у меня было примерно такое решение
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.             IF(senderUserId = {$user->id},receiverUserId,senderUserId) dialogUserId, `text`,
  3.             MAX(createdAt) createdAt, isRead
  4.           FROM message
  5.             WHERE (senderUserId = {$user->id} OR receiverUserId = {$user->id})
  6.             GROUP BY dialogUserId
  7.             ORDER BY createdAt DESC
  8.             LIMIT 10

Вопрос:
Что хранится в dialogUserId? И `text` - это текст сообщения?
26. Sail - 18 Сентября, 2014 - 20:15:17 - перейти к сообщению
ksedin пишет:
Мне нужно, как в ВК

И действительно! Устами Мелкий'ого (чуть ниже) глаголет истина...
27. ksedin - 18 Сентября, 2014 - 20:19:18 - перейти к сообщению
Sail пишет:

Выбираем из таблицы для одного получателя (myid) всех отправителей и время последнего сообщения.


Выходит, что если пользователь сам отправил сообщение, не получив при этом ответа - диалог не будет отображаться?
28. Мелкий - 18 Сентября, 2014 - 20:46:01 - перейти к сообщению
ksedin пишет:
Что хранится в dialogUserId?

user_id собеседника.

Решения задачи в лоб слишком тяжеловесны. Сделайте отдельно таблицу диалогов, ссылающуюся на последнее сообщение в переписке. Для этой задачи (как и многих других в вебе) характерно существенное превалирование чтения над записью.
29. ksedin - 18 Сентября, 2014 - 21:11:14 - перейти к сообщению
Решения задачи в лоб слишком тяжеловесны. Сделайте отдельно таблицу диалогов, ссылающуюся на последнее сообщение в переписке.[/quote]
Пока не совсем понимаю, как мне это поможет, можно подробней?
30. Мелкий - 18 Сентября, 2014 - 21:23:22 - перейти к сообщению
Как чем поможет? Джойните по внешнему ключу и получаете сразу последние сообщения в диалогах.

 

Powered by ExBB FM 1.0 RC1