Вопрос знатокам Mysql

12
M
На сайте с 20.08.2004
Offline
376
697

Не знаю как правильно сформулировать, но, попытаюсь.

Есть таблица личных сообщений,

pm:

pm_id //айди

user1_id //отправитель

user2_id //получатель

pm_user2_new //прочитал ли получатель письмо

Задача1 минимум : из таблицы нужно выбрать, по ОДНОЙ ПОСЛЕДНЕЙ записи пользователя

Если группировать по user1_id , то получаем ОДНУ ЗАПИСЬ, но ПЕРВУЮ!

SELECT pm.pm_id,  pm.pm_user2_new, 
u1.user_id as user1_id, u2.user_id as user2_id,u1.user_nickname as user1_nickname,
u2.user_nickname as user2_nickname
FROM bt_pm as pm
LEFT JOIN bt_user as u1 ON pm.pm_user1_id = u1.user_id
LEFT JOIN bt_user as u2 ON pm.pm_user2_id = u2.user_id
WHERE (pm.pm_user1_id = 108491 && pm.pm_user1_del = 0) ||
(pm.pm_user2_id = 108491 && pm.pm_user2_del = 0)
/*GROUP BY pm.pm_user1_id*/
ORDER BY pm.pm_id DESC LIMIT 1000

Такой запрос выводит все сообщения, на пхп я конечно сортирую данные и могу получить ОДНУ ПОСЛЕДНЮЮ ЗАПИСЬ. Но возможно есть возможность все это сделать на MYSQL!

Задача 2 максимум: если такое вообще возможно, выводить последнее сообщение для пары из user_id1 user_id2 или user_id2 user_id1.

зы. Я наверное мазохист, но я говорю об одном MYSQL запросе! Просто я себе не представляю как это можно сделать, но ведь это не означает что решения нет!

спасибо.

отец сыночка, лапочки дочки и еще одного сыночка
domen4you
На сайте с 08.03.2013
Offline
53
#1

DESC LIMIT 1

M
На сайте с 20.08.2004
Offline
376
#2

сейчас все то что мне надо решает вот такая строка в цикле перебора foreach

  $users1_array = array();   
foreach ($pm_list as $pm)
{

if (in_array(array($pm[user1_id], $pm[user2_id]), $users1_array)) continue;
else
{
$users1_array[] = array ($pm[user1_id], $pm[user2_id]);
$users1_array[] = array ($pm[user2_id], $pm[user1_id]);
}



---------- Добавлено 22.01.2015 в 10:16 ----------

domen4you:
DESC LIMIT 1

)))

я всегда считал что лимит для другого ))

возможно я не понятно выразился ))

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#3
я всегда считал что лимит для другого ))

В смысле для другого ?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
M
На сайте с 20.08.2004
Offline
376
#4

LIMIT 1 выведет только одну записать

А мне нужно вывести все, но уникальные и последние!

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#5
Miracle:
А мне нужно вывести все, но уникальные и последние!
из таблицы нужно выбрать, по ОДНОЙ ПОСЛЕДНЕЙ записи пользователя

Определитесь уже.

---------- Добавлено 22.01.2015 в 14:31 ----------

А вообще лучше решать на PHP такие вопросы. Чем проще запросы, тем быстрее mysql будет их обрабатывать.

M
На сайте с 20.08.2004
Offline
376
#6
LEOnidUKG:
Определитесь уже.

определился

Miracle:
А мне нужно вывести все, но уникальные и последние!
LEOnidUKG:
А вообще лучше решать на PHP такие вопросы. Чем проще запросы, тем быстрее mysql будет их обрабатывать.

с одной стороны проще запросы быстрее обработка

с другой стороны больше запросов больше обращений к бд

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#7
Miracle:

с одной стороны проще запросы быстрее обработка
с другой стороны больше запросов больше обращений к бд

И что что их больше? Кэш справляется отлично с этим. Уж побыстрее чем JOIN хранить в кэше.

M
На сайте с 20.08.2004
Offline
376
#8
LEOnidUKG:
И что что их больше? Кэш справляется отлично с этим. Уж побыстрее чем JOIN хранить в кэше.

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

сделать , сейчас прикину, штук 6+- простых запросов?

Честно сказать даже не знаю. Хотелось бы мнение спецов.

edogs software
На сайте с 15.12.2005
Offline
775
#9
Miracle:

Задача 2 максимум: если такое вообще возможно, выводить последнее сообщение для пары из user_id1 user_id2 или user_id2 user_id1.

зы. Я наверное мазохист, но я говорю об одном MYSQL запросе! Просто я себе не представляю как это можно сделать, но ведь это не означает что решения нет!

Решение есть, при чем достаточно шустрое, общая мысль тут в первом абзаце

/ru/forum/comment/5029477 .

Смысл тут в том, что бы выбрать только те значения, для которых значения с бОльшей датой не существует (джоиним таблицу с постами саму на себя соединяя по дате и оставляем только те строки, в которые приджоинить ничего не удалось).

Другое решение - вложенный мускул запрос, т.е. используете select max(postid) по нужным фильтрам и потом уже делаете выбор полных данных по типу select (полные данные) from ( select max(postid) по нужным фильтрам ). Но все это в одном sql запросе, просто используя вложенные.

Более традиционен и понятен второй вариант.

Более быстр первый.

На пхп такую задачу решать это маразм конечно.

p.s.: думается сейчас плохо, если нужно точный запрос - вечером накидаем.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
totamon
На сайте с 12.05.2007
Offline
437
#10
Задача1 минимум : из таблицы нужно выбрать, по ОДНОЙ ПОСЛЕДНЕЙ записи пользователя
Если группировать по user1_id , то получаем ОДНУ ЗАПИСЬ, но ПЕРВУЮ!

те по одной записи, но где он получатель и где отправитель? в итоге результатом должно быть 2 записи?

если так то можно через UNION два запроса объединить с GROUP BY только в селект добавьте уже функцию которая к полю группировки применяется например MAX(pm_id)

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий