Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчет количества по нескольким условиям
 
 автор: durable   (24.07.2009 в 16:05)   письмо автору
 
 

Меня интересует как делается посчет, например, постов в каждой из тем форума?

Я понимаю так - есть 2 таблицы:
Темы
id_tema name_tema

Посты
id_post id_tema text_post

Для меня единственный пока способ это быбрать из таблицы с темами нужные темы, а потом в цикле по ним пробежаться и через COUNT(*) подсчитать в каждой количество постов.

Но это получается, что количество запросов к базе будет довольно таки большим.
А если это не темы а меню в котором надо посчитать количество статей например..
Это же получается что накаждой странице прийдется делать весь набор запросов?

Может быть есть путь проще?

  Ответить  
 
 автор: Жмурик   (24.07.2009 в 16:07)   письмо автору
 
   для: durable   (24.07.2009 в 16:05)
 

> Может быть есть путь проще?
Есть.

Грубо говоря, выбери из множества tema x post такое подмножество, у которого tema.id_tema = post.id_tema (имхо, лучше "soobsсhenie.id_thread"), это будут своеобразные классы эквивалентности по отношению "равны id_tema". Тогда в этих классах нужно подсчитать количество элементов и всё. гг

  Ответить  
 
 автор: durable   (24.07.2009 в 21:04)   письмо автору
 
   для: Жмурик   (24.07.2009 в 16:07)
 

Мысль понял попробовал даже получается таблица вида:
1
1
1
1
2
2
3
3
3
3
4
4
4
5
получается дальше на php надо ее обработать...
мысли такие создавать ассоциативный массив, key которого будут равен id темы и потом наращивать его по мере обработки полученно таблицы... при выводе пункта меню выводить соответствующий элемент массива с key = id темы

или есть другие мысли?

  Ответить  
 
 автор: Жмурик   (24.07.2009 в 22:07)   письмо автору
 
   для: durable   (24.07.2009 в 21:04)
 

Блин, да вот тебе сухой код
SELECT t.*, COUNT( p.id_post ) AS cnt FROM threads t LEFT JOIN posts p ON t.id_tema = p.id_tema GROUP BY t.id_tema

Если хочешь, могу его мокрым сделать!

  Ответить  
 
 автор: durable   (25.07.2009 в 11:56)   письмо автору
 
   для: Жмурик   (24.07.2009 в 22:07)
 

Нет, мокрым не надо =)
Спасибо!

  Ответить  
 
 автор: Рома   (25.07.2009 в 00:10)   письмо автору
 
   для: durable   (24.07.2009 в 16:05)
 

Можно продолжу в твоей теме?

У меня тоже подобное, но не могу собрать до кучи.

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


таблица тем
id - автоинкремент
id_forum - номер форума
name - название темы
max_time - время добавления последнего поста

таблица постов
id - автоинкркмент
id_themes - номер темы

Получается примерно так, но что-то не але

не это бред, аж сотру


Плюс ко всему я понятия не имею куда вставить номер форума

Объясните пожалуйста, хочется одним запросом обойтись.

  Ответить  
 
 автор: Trianon   (25.07.2009 в 00:58)   письмо автору
 
   для: Рома   (25.07.2009 в 00:10)
 

Вот г-н Жмурик только что написал запрос.
Ограничиться конкретным форумом - еще один штрих WHERE t.id_forum = $forumID .
А добавить к нему сортировку и LIMIT, по-моему, не требует вообще никаких раздумий.

  Ответить  
 
 автор: Рома   (25.07.2009 в 01:13)   письмо автору
 
   для: Trianon   (25.07.2009 в 00:58)
 

Да, вы правы - все получилось... только еще кое что не учел.

возле темы теперь стоит количество постов в ней, а еще хотелось бы видеть цифру новых постов с момента последнего посещения. Для этого нужно использовать еще одну переменную $time, и сравнивать ее с sfm_posts.reg_data. Через UNION чето ругается сильно, даже когда каждый запрос в своих скобках, а ORDER BY после обоих запросов. Реально ее в этот запрос запихнуть? Или здесь придется отдельным циклом проходить? Тогда может несоответствие иногда проскакивать, да?


$sql="SELECT sfm_themes.name, sfm_themes.time_reg_max_post,
 COUNT(sfm_posts.pn) AS num FROM sfm_themes LEFT
  JOIN sfm_posts ON sfm_themes.pn=sfm_posts.themes
    WHERE sfm_themes.forums=".$f." GROUP BY sfm_themes.pn
     ORDER BY sfm_themes.time_reg_max_post DESC LIMIT 5";

а, забыл, а стоит ли для главной страницы форума, такой как здесь, делать выборку одним запросом, или лучше циклом пробежаться? Как правильней? Топики я имею в виду.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования