Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> sql запрос диалогов пользователей, прошу помощи в написании запроса. ибо сам мучаюсь неделю
user_sasha  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Всем доброго времени суток. опишу свою задачу.

Делаю систему сообщений на своем сайте. Система выглядит примерно как в вк. Уже написал вывод диалогА пользователя с другим пользователем, и отправка сообщений с этим пользователем.

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

К примеру:
сообщение 1: 1 пользователь - 2 пользователь - текст1 дата 0000-00-00 00:00:00
сообщение 2: 2 пользователь - 1 пользователь - текст2 дата 0000-00-00 00:00:01
сообщение 3: 1 пользователь - 2 пользователь - текст3 дата 0000-00-00 00:00:02
сообщение 4: 1 пользователь - 3 пользователь - текст4 дата 0000-00-00 00:00:10
сообщение 5: 3 пользователь - 1 пользователь - текст5 дата 0000-00-00 00:00:11
сообщение 6: 3 пользователь - 1 пользователь - текст6 дата 0000-00-00 00:00:12

в данном случае мне нужно вывести диалоги первого пользователя по последним сообщениям.
ТОЕСТЬ должно получиться так:
сообщение 3: 1 пользователь - 2 пользователь - текст3 дата 0000-00-00 00:00:02
сообщение 6: 3 пользователь -1 пользователь - текст6 дата 0000-00-00 00:00:12

Выкладываю скрин как это должно выглядеть

user posted image

Что пробовал я?
`users_1`='14' OR `users_2`='14' где 14 это id пользователя которому нужно вывести его диалоги с теми пользователями с которыми он общается
SELECT MAX(`data`), MAX(`text`), MAX(`id`),max(`users_1`),max(`users_2`) FROM `mes` WHERE `users_1`='14' OR `users_2`='14' GROUP BY CONCAT(LEAST(`users_1`,`users_2`),'-',GREATEST(`users_1`,`users_2`))


В данном случае он не выводит последний текст и users_1 и users_2.
Прошу помочь.. Ибо я уже сломал голову..

Это сообщение отредактировал user_sasha - 20.01.2016 - 11:14
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5493
Пользователь №: 35718
На форуме: 4 года, 16 дней
Карма: 167




Цитата (user_sasha @ 20.01.2016 - 10:12)
CONCAT(LEAST(`users_1`,`users_2`),'-',GREATEST(`users_1`,`users_2`))

ой чую неладное с архитектурой БД
начинайте всегда вопрос с дампа таблицы


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
user_sasha  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Цитата (Valick @ 20.01.2016 - 11:22)
Цитата (user_sasha @ 20.01.2016 - 10:12)
CONCAT(LEAST(`users_1`,`users_2`),'-',GREATEST(`users_1`,`users_2`))

ой чую неладное с архитектурой БД

этот пример я взял с сайта.. когда пытался найти чтото похожее

users_1 - тот кто отправил сообщение
users_2 тот кто получил сообщение

вот дамп. но эта таблица создана в качестве теста.

-- phpMyAdmin SQL Dump
-- version 4.0.10.10
-- http://www.phpmyadmin.net
--
--
Хост: 127.0.0.1:3306
-- Время создания: Янв 20 2016 г., 10:31
-- Версия сервера: 5.5.45
-- Версия PHP: 5.3.29

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
--
База данных: `test`
--

-- --------------------------------------------------------

--
--
Структура таблицы `mes`
--

CREATE TABLE IF NOT EXISTS `mes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`text` text NOT NULL,
`users_1` int(11) NOT NULL,
`users_2` int(11) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;

--
--
Дамп данных таблицы `mes`
--

INSERT INTO `mes` (`id`, `data`, `text`, `users_1`, `users_2`) VALUES
(9, '2016-01-19 07:15:58', 'текст 1', 1, 2),
(
10, '2016-01-19 07:03:34', 'текст 2', 2, 1),
(
11, '2016-01-19 07:21:15', 'текст 3', 4, 1),
(
12, '2016-01-19 07:18:27', 'fdsgrdgfds', 1, 4),
(
13, '2016-01-19 07:12:06', 'hfdshgrehrehrerh', 3, 1),
(
14, '2016-01-19 07:21:44', 'dszghsrfhgdjgfdgds', 1, 15),
(
15, '2016-01-19 07:21:44', 'fdhgdjgdjjt', 16, 1);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Это сообщение отредактировал user_sasha - 20.01.2016 - 11:29
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5493
Пользователь №: 35718
На форуме: 4 года, 16 дней
Карма: 167




если вы ищите всех переписчиков для user1, то группировать надо по user2 естественно предварительно задав условие выборки только тех записей которые отвечают переписке с user1 (например с идентификатором 1), выбирать все необходимые id и только после этого выбирать тексты сообщений соединением таблицы самой к себе


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 3 дня
Карма: 184




Может оказаться, что лучше будет хранить ид последнего сообщения диалога где-то (например, в таблице диалогов). иначе как-то так
select m1.*
from mes as m1
left join mes as m2 on m1.users_2=m2.users_2 and m1.id<m2.id
where m1.users_1 = $userId and m2.id is null
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
user_sasha  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Цитата (Valick @ 20.01.2016 - 11:35)
если вы ищите всех переписчиков для user1, то группировать надо по user2 естественно предварительно задав условие выборки только тех записей которые отвечают переписке с user1 (например с идентификатором 1)

я немножко не понял... если группировать по users_2 где пользователь получил сообщение, а users_1 тот кто отправил, то в этом случае вывод не будет последнего сообщения для того, кто отправил письмо.. а вывод будет только для того, кто получил письмо, или я не так понимаю?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5493
Пользователь №: 35718
На форуме: 4 года, 16 дней
Карма: 167




Цитата (user_sasha @ 20.01.2016 - 10:43)
а вывод будет только для того, кто получил письмо, или я не так понимаю?

да это так, давно не занимался перепиской


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
user_sasha  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Цитата (Valick @ 20.01.2016 - 11:47)
Цитата (Valick @ 20.01.2016 - 11:47)
да это так, давно не занимался перепиской


и получается мне нужно группировать по users_1 или по users_2 где id пользователя = к примеру 1.
я это знаю..
я так понял по Вашему сообщению что мне надо сначала найти последнее id где users_1=1 или по users_2=1 и после чего выводить сообщение?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5493
Пользователь №: 35718
На форуме: 4 года, 16 дней
Карма: 167




Цитата (user_sasha @ 20.01.2016 - 10:56)
что мне надо сначала найти последнее id

да, потому как при группировке вы можете выбрать либо MAX(id) (что предпочтительнее) либо MAX(data), но никак не MAX(text)


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
user_sasha  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Цитата (Valick @ 20.01.2016 - 12:01)
Цитата (user_sasha @ 20.01.2016 - 10:56)
что мне надо сначала найти последнее id

да, потому как при группировке вы можете выбрать либо MAX(id) (что предпочтительнее) либо MAX(data), но никак не MAX(text)

вот я дурак... и думаю почему MAX(text) не работает) ладно буду пробовать дальше, если что напишу еще..
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
user_sasha  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Цитата (Valick @ 20.01.2016 - 12:01)
Цитата (user_sasha @ 20.01.2016 - 10:56)
что мне надо сначала найти последнее id

да, потому как при группировке вы можете выбрать либо MAX(id) (что предпочтительнее) либо MAX(data), но никак не MAX(text)

Запрос как то так должен выглядеть? хочу обратить особое внимание на
on m1.users_1 = m2.users_1 OR m1.users_2 = m2.users_2


SELECT m1.*
FROM mes AS m1
LEFT JOIN mes AS m2 on m1.users_1 = m2.users_1 OR m1.users_2 = m2.users_2
WHERE m2.id = (SELECT MAX(id) FROM mes WHERE users_1 = 1 OR users_2 = 1)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 3 дня
Карма: 184




user_sasha, не хотелось бы вновь прерывать вашу с Valikом беседу, но все же, чем не угодил вариант, который был предложен мной выше?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
user_sasha  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Цитата (kaww @ 20.01.2016 - 12:22)
user_sasha, не хотелось бы вновь прерывать вашу с Valikом беседу, но все же чем не угодил вариант, который был предложен мной выше?

объясните пожалуйста как он работает.. ибо лично я его проверил и у меня вышла ошибка..
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 3 дня
Карма: 184




Цитата (user_sasha @ 20.01.2016 - 08:28)
и у меня вышла ошибка

Что за ошибка? Разумеется, вместо $userId нужно подставить id пользователя, для которого вывести список последних сообщений в диалогах
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
user_sasha  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 8
Пользователь №: 42409
На форуме: 10 месяцев, 15 дней
Карма:




Цитата (kaww @ 20.01.2016 - 12:36)
Цитата (user_sasha @ 20.01.2016 - 08:28)
и у меня вышла ошибка

Что за ошибка? Разумеется, вместо $userId нужно подставить id пользователя, для которого вывести список последних сообщений в диалогах

да точно. все работает.. единственное что выбирается все из users_1 а можно как то выбирать в данном случае из users_1 или из users_2?


PS. щас проверил, если users_1 больше users_2 то ничего не выводиться

Это сообщение отредактировал user_sasha - 20.01.2016 - 12:49
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса