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

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

1. Саныч - 11 Апреля, 2012 - 20:31:33 - перейти к сообщению
Есть таблица, с колонками: id INT, topic INT, add_date DATETIME

Не могу составить запрос, чтобы выбрать пять последних униальных значений topic, отсортированые по времени от нового к старым...
2. LIME - 11 Апреля, 2012 - 20:51:57 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT  topic ORDER BY add_date LIMIT 5
так чтоли?
3. DeepVarvar - 11 Апреля, 2012 - 20:56:30 - перейти к сообщению
Не, не, ребята, отбой, там у него что-то с таблицей не так.
Запрос не есть проблема. (общаемся в аське с ним)
4. LIME - 11 Апреля, 2012 - 20:56:59 - перейти к сообщению
Саныч пишет:
пять последних униальных значений topic, отсортированые по времени от нового к старым...
блин запутал))
это же 5 первых от старых к новым
тоесть 5 старейших
(Добавление)
DeepVarvar ясн
5. Bio man - 11 Апреля, 2012 - 20:59:14 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `id`, `topic`, MAX(`add_date`) FROM `таблица` GROUP BY `topic` HAVING(MAX(`add_date`)) ORDER BY `add_date` DESC LIMIT 5;
? Не уверен с порядком условий, но суть ясна
-----------------------
DeepVarvar, ясно
6. Саныч - 11 Апреля, 2012 - 21:07:28 - перейти к сообщению
Опишу подробно суть вопроса, как смогу. А то получается, что DeepVarvar-у нужно больше чем мне)

Есть 2 таблицы: forum_messages и forum_topics, ну из названий ясно что есть что.
forum_messages:
id | topic (ключ на forum_topics) | add_date

Чтобы не делать отдельного поля в таблице тем с временем последнего поста, определяю его (время) по времени добавления последнего сообщения из таблицы постов.

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

пробовал следующий запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `forum_messages` GROUP BY `topic` ORDER BY `add_date` DESC
Запрос работает как надо, сначало групирует, затем сортирует.
А вот мне нужно отсортировать, а затем уже сгруппировать.
Вот собственно в этом и суть вопроса.
7. DeepVarvar - 11 Апреля, 2012 - 21:07:51 - перейти к сообщению
Топик может повторяться и поэтому сперва нужно отсортировать
8. LIME - 11 Апреля, 2012 - 21:08:12 - перейти к сообщению
Bio man пишет:
но суть ясна
вообщето нет))
будет 1 строка в результате
(Добавление)
DeepVarvar а дистинкт тут не поможет?
9. Саныч - 11 Апреля, 2012 - 21:10:11 - перейти к сообщению
LIME, почему одна строка?
DISTINCT не помог, проверено.
10. DeepVarvar - 11 Апреля, 2012 - 21:11:44 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM (SELECT * FROM tbl ORDER BY add_date DESC) TBL GROUP BY topic LIMIT 5
11. LIME - 11 Апреля, 2012 - 21:12:14 - перейти к сообщению
дык вроде мой первый пост? нет?
12. Саныч - 11 Апреля, 2012 - 21:13:49 - перейти к сообщению
DeepVarvar +1. Спасибо! Именно то, что нужно.
(Добавление)
Возник еще вопросец. Запрос написал, вытягивает все как нужно, но запросец получился...

Вобщем может подскажете что, как его можно улучшить, уменьшить, оптимизировать.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.    t1.topic, t2.login, t4.title, t4.description,
  3.    DATE_FORMAT( t1.add_date, "%d.%m.%Y %H:%i" ) AS update_date,
  4.    (
  5.       SELECT COUNT( * )
  6.       FROM forum_messages t5
  7.       WHERE t5.topic = t4.id
  8.    ) AS answers,
  9.    (
  10.       SELECT COUNT( * )
  11.       FROM forum_views t6
  12.       WHERE t6.topic = t4.id
  13.    ) AS views,
  14.    IF( (
  15.          SELECT COUNT( * )
  16.          FROM forum_views t5
  17.          WHERE t5.user = 1 AND t5.topic = t4.id
  18.       ) = 0 OR
  19.       t1.add_date < (
  20.          SELECT t5.`date`
  21.          FROM forum_views t5
  22.          WHERE t5.user = 1 AND t5.topic = t1.topic
  23.          ORDER BY t5.`date` DESC
  24.          LIMIT 1
  25.       ),
  26.       1,
  27.       0
  28.    ) AS new_posts
  29. FROM (
  30.    SELECT *
  31.    FROM forum_messages t3
  32.    ORDER BY t3.add_date DESC
  33. ) t1
  34. LEFT JOIN users t2 ON t2.id = t1.user
  35. LEFT JOIN forum_topics t4 ON t4.id = t1.topic
  36. GROUP BY t1.topic
  37. ORDER BY t1.add_date DESC
  38. LIMIT 5

 

Powered by ExBB FM 1.0 RC1