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

Форум PHP

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

 

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

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

тема: Упростить запрос к базе
 
 автор: oli   (22.09.2008 в 01:04)   письмо автору
 
 

У меня на страницу сайта(в виде таблице HTML) выводится информация о статьях с базы через цикл while.

$result = mysql_query("SELECT * FROM `history` ORDER BY date ",$link);
if(mysql_num_rows($result)>0){



while(($myrow=mysql_fetch_array($result))>0){
Здесь вывод данных из базы в виде таблицы HTML
}

}

К дополнению к таблице информации о статьи добавляется число комментариев
Вот так: Комментариев(здесь кол-во комментариев из другой таблицы mysql)


Т-е для каждой статьи свое кол-во комментариев, которые выводятся из другой таблицы mysql(history_comments)
Так вот я для этого засовываю вот этот запрос(что есть наверное нерационально и сильно загружающее)
$sql = "SELECT COUNT(post) FROM history_comments WHERE post =  '$myrow[id]'"; 
$res = mysql_query($sql) or die( mysql_error()); 

$count22 = mysql_result($res, 0);

в цикл который написан выше и получаю для каждой отдельной статьи свое число комментов!
Это сильно нагружает систему тк статей очень много и в цикле подсчитывать для каждой-очень тупо!
Как упростить этот механизм?
Думаю понятно объяснил!
Заметить самое главное хотел-это то что для запроса 2(кол-во) используется идентификатор($myrow[id]) от запроса 1

  Ответить  
 
 автор: Drago   (22.09.2008 в 01:48)   письмо автору
 
   для: oli   (22.09.2008 в 01:04)
 

>Как упростить этот механизм?

Добавьте в таблицу статей столбец, в котором будет храниться количество коментариев.

Если не хотите, то выборку статей можно сделать таким образом:

SELECT `нужные столбцы таблицы history`, COUNT(hc.post) AS `kolvo`
FROM `history` 
LEFT JOIN `history_comments` AS `hc` ON `post` = `ID статьи`
GROUP BY `ID статьи`
ORDER BY date

  Ответить  
 
 автор: Trianon   (22.09.2008 в 01:52)   письмо автору
 
   для: oli   (22.09.2008 в 01:04)
 

SELECT h.*, cmts 
  FROM history AS h 
    LEFT JOIN 
    (SELECT post, COUNT(post) AS cmts 
      FROM history_comments 
      GROUP BY post
    ) AS r
   ON h.id = r.post
ORDER BY `date`


Есть хоть малейшая причина поднимать эту тему здесь, а не в разделе MySQL?!

  Ответить  
 
 автор: OLi   (22.09.2008 в 01:54)   письмо автору
 
   для: Trianon   (22.09.2008 в 01:52)
 

За неверное расположение темы прошу прошения-не хотел!

  Ответить  
 
 автор: oli   (22.09.2008 в 12:44)   письмо автору
 
   для: OLi   (22.09.2008 в 01:54)
 

Спасибо огромное-Все заработало!
Только вот один момент-если в таблице комментов нет записей-то выводится вот так
Комментариев ()
а надо так Комментариев (0)
Опять что-ли в цикл проверку записей вводить?!

  Ответить  
 
 автор: Trianon   (22.09.2008 в 13:27)   письмо автору
 
   для: oli   (22.09.2008 в 12:44)
 

Там null возвращается в таких случаях.
Соответственно, не проверка нужна, а преобразование к целому. intval()
Либо учитывать случай null прямо в запросе:
SELECT h.*, COALESCE(cmts, 0) AS cmnts 
...

  Ответить  
 
 автор: xx77   (22.09.2008 в 14:47)   письмо автору
 
   для: oli   (22.09.2008 в 12:44)
 

SELECT history.* , IFNULL(COUNT(history_comments.post), 0)  AS cmts
FROM history
LEFT JOIN history_comments ON history.id = history_comments.post
GROUP BY history.date DESC


как-то так ещё можно

  Ответить  
 
 автор: Trianon   (22.09.2008 в 14:56)   письмо автору
 
   для: xx77   (22.09.2008 в 14:47)
 

так - нельзя.
Причем, если history.date не является уникальным ключом (а оно однозначно не является) , то так нельзя категорически.

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

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