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 :: Версия для печати :: Выборка последних сообщений от и к пользователю
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Выборка последних сообщений от и к пользователю

Страниц (1): [1]
 

1. Telnet - 19 Марта, 2018 - 18:25:14 - перейти к сообщению
Есть такая таблица
http://prntscr[dot]com/itcugr

Как составить запрос так что б он показал только последние сообщения от и к пользователю с user_id = 44
что б на выходе остались записи с id 8,6,3,2
2. Telnet - 20 Марта, 2018 - 13:02:55 - перейти к сообщению
Я таки сделал не знаю правильно или можно было как то сократить
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT t1.* FROM userMessage AS t1, userMessage AS t2
  3. WHERE  t1.created IN (SELECT max(t2.created) FROM userMessage AS t2
  4. WHERE t2.to_user_id = 44 OR t2.from_user_id = 44 GROUP BY t2.to_user_id, t2.from_user_id)
  5. AND t1.to_user_id IN (SELECT t2.to_user_id FROM userMessage AS t2
  6. WHERE t2.to_user_id = 44 OR t2.from_user_id = 44 GROUP BY t2.to_user_id, t2.from_user_id)
  7. AND t1.from_user_id IN (SELECT t2.from_user_id FROM userMessage AS t2
  8. WHERE t2.to_user_id = 44 OR t2.from_user_id = 44 GROUP BY t2.to_user_id, t2.from_user_id)
  9. GROUP BY t1.id  ORDER BY `t1`.`created` DESC
  10.  

Если у кого есть идеи как сделать лучше пишите
3. Vladimir Kheifets - 20 Марта, 2018 - 18:48:17 - перейти к сообщению
Telnet пишет:
Я таки сделал не знаю правильно или можно было как то сократить
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT t1.* FROM userMessage AS t1, userMessage AS t2
  3. WHERE  t1.created IN (SELECT max(t2.created) FROM userMessage AS t2
  4. WHERE t2.to_user_id = 44 OR t2.from_user_id = 44 GROUP BY t2.to_user_id, t2.from_user_id)
  5. AND t1.to_user_id IN (SELECT t2.to_user_id FROM userMessage AS t2
  6. WHERE t2.to_user_id = 44 OR t2.from_user_id = 44 GROUP BY t2.to_user_id, t2.from_user_id)
  7. AND t1.from_user_id IN (SELECT t2.from_user_id FROM userMessage AS t2
  8. WHERE t2.to_user_id = 44 OR t2.from_user_id = 44 GROUP BY t2.to_user_id, t2.from_user_id)
  9. GROUP BY t1.id  ORDER BY `t1`.`created` DESC
  10.  

Если у кого есть идеи как сделать лучше пишите

Добрый день!
У меня была примерно такая же идея с .... IN (SELECT max(created)....
Попробовал в phpMyAdmin на одной таблице, в которой более 30000 строк и 23 столбца, один из которых типа “date”.
Результата не дождался... Может Вам повезёт.
Удачи!
4. Telnet - 21 Марта, 2018 - 12:50:26 - перейти к сообщению
Цитата:

Добрый день!
У меня была примерно такая же идея с .... IN (SELECT max(created)....
Попробовал в phpMyAdmin на одной таблице, в которой более 30000 строк и 23 столбца, один из которых типа “date”.
Результата не дождался... Может Вам повезёт.
Удачи!

Спасибо за совет я переписал вот так а потом уже по результату прохожу в цикле и выбираю нужные строки
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT to_user_id, from_user_id, max(created) AS created FROM userMessage WHERE to_user_id = :user_id OR FROM_user_id = :user_id GROUP BY to_user_id, from_user_id ORDER BY created DESC
  3.  


Этот выполнился в 3 раза быстрее

 

Powered by ExBB FM 1.0 RC1