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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: SELECT уникальных значений

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Саныч Модератор
Отправлено: 11 Апреля, 2012 - 20:31:33
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Есть таблица, с колонками: id INT, topic INT, add_date DATETIME

Не могу составить запрос, чтобы выбрать пять последних униальных значений topic, отсортированые по времени от нового к старым...


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
LIME
Отправлено: 11 Апреля, 2012 - 20:51:57
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT  topic ORDER BY add_date LIMIT 5
так чтоли?

(Отредактировано автором: 11 Апреля, 2012 - 20:53:45)

 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Апреля, 2012 - 20:56:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Не, не, ребята, отбой, там у него что-то с таблицей не так.
Запрос не есть проблема. (общаемся в аське с ним)
 
 Top
LIME
Отправлено: 11 Апреля, 2012 - 20:56:59
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Саныч пишет:
пять последних униальных значений topic, отсортированые по времени от нового к старым...
блин запутал))
это же 5 первых от старых к новым
тоесть 5 старейших
(Добавление)
DeepVarvar ясн
 
 Top
Bio man
Отправлено: 11 Апреля, 2012 - 20:59:14
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




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, ясно

(Отредактировано автором: 11 Апреля, 2012 - 21:00:36)

 
 Top
Саныч Модератор
Отправлено: 11 Апреля, 2012 - 21:07:28
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Опишу подробно суть вопроса, как смогу. А то получается, что 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
Запрос работает как надо, сначало групирует, затем сортирует.
А вот мне нужно отсортировать, а затем уже сгруппировать.
Вот собственно в этом и суть вопроса.


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Апреля, 2012 - 21:07:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Топик может повторяться и поэтому сперва нужно отсортировать
 
 Top
LIME
Отправлено: 11 Апреля, 2012 - 21:08:12
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Bio man пишет:
но суть ясна
вообщето нет))
будет 1 строка в результате
(Добавление)
DeepVarvar а дистинкт тут не поможет?
 
 Top
Саныч Модератор
Отправлено: 11 Апреля, 2012 - 21:10:11
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




LIME, почему одна строка?
DISTINCT не помог, проверено.


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Апреля, 2012 - 21:11:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM (SELECT * FROM tbl ORDER BY add_date DESC) TBL GROUP BY topic LIMIT 5
 
 Top
LIME
Отправлено: 11 Апреля, 2012 - 21:12:14
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




дык вроде мой первый пост? нет?
 
 Top
Саныч Модератор
Отправлено: 11 Апреля, 2012 - 21:13:49
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




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


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB