Оптимизация кол-ва запросов
Добавлено:
30 янв 2010, 07:26
Zver
Вообщем, имеется таблица в БД - news, в не поля id, .... , author. Так вот author - INT, т.е. указывается ID автора. И что бы вывести автора новости нужно для каждой новости делать дополнительне запросы. Как можно оптимизировать эту систему? И нельзя ли всё сделать одним запросом? (вывод авторов)
Re: Оптимизация кол-ва запросов
Добавлено:
30 янв 2010, 07:52
Rostov114
Код в студию...
Но чую что можно все решить LEFT JOIN запросами.
Re: Оптимизация кол-ва запросов
Добавлено:
30 янв 2010, 08:31
Zver
Функция для вывода автора
- Код: Выделить всё • Развернуть
function getAuthor($user_id){
$sql = "SELECT `username` FROM `users` WHERE `id` = '".$user_id."'";
$res = sqlCount($sql, false);
$row = mysql_fetch_array($res);
return $row['username'];
}
Функция для чтение новостей
- Код: Выделить всё • Развернуть
function LastSiteNews($col){
if($col == 0 || $col < 0){
return 'News disabled';
} else {
$sql = "SELECT `id`,`title`,`content`,`date`,`time`,`views` FROM `news` WHERE `category` = '1' ORDER BY `id` DESC LIMIT ".$col;
$res = sqlCount($sql, false);
for($i=0; $i<$col; $i++){
$row = mysql_fetch_array($res);
if($row){
$date = DATEfilter($row['date']);
$temp = array(
'{TITLE}' => $row['title'],
'{ID}' => $row['id'],
'{CONTENT}' => $row['content'],
'{DATE}' => $date,
'{TIME}' => $row['time'],
'{COMMENTS}' => commentsCount($row['id']),
'{VIEWS}' => $row['views'],
'{AUTHOR}' => getAuthor($row['id']),
);
$temp['{CONTENT}'] = BBfilter($temp['{CONTENT}']);
$ret .= toTemplate('tpl/news/main.tpl', $temp);
}
}
return $ret;
}
}
ЗЫ: Я не когда не работал со сложными запросами) так что сильно не бить)
Re: Оптимизация кол-ва запросов
Добавлено:
30 янв 2010, 14:58
Zver
Помозговав, додумался сам
- Код: Выделить всё • Развернуть
SELECT users.id, users.username, news.id, news.title, news.author_id, news.content, news.category, news.views, news.date, news.time
FROM news LEFT JOIN users ON users.id = news.author_id WHERE category = '1'
ORDER BY news.id DESC LIMIT 5
Вот как теперь мне подсчитать кол-во комментариев к новости этим же запросом?
Re: Оптимизация кол-ва запросов
Добавлено:
30 янв 2010, 19:18
Zver
Добавил, он мне бред выводит:
- Код: Выделить всё • Развернуть
SELECT users.id,
users.username,
news.id,
news.title,
news.content,
news.author_id,
news.category,
news.views,
news.date,
news.time,
news_comments.news_id
FROM news LEFT JOIN users ON users.id = news.author_id
LEFT JOIN news_comments ON news_comments.news_id = news.id
WHERE news.category = '1'
ORDER BY news.id DESC LIMIT 5
Новости дублируются, каким то путём. Смотрел через print_r();, появляется два одинаковых массива...
Re: Оптимизация кол-ва запросов
Добавлено:
30 янв 2010, 19:29
Zver
Всё, огромное спасибо! ^^
Подсчёт комментариев додумался сделать count'om (=
- Код: Выделить всё • Развернуть
SELECT users.id,
users.username,
news.id,
news.title,
news.content,
news.author_id,
news.category,
news.views,
news.date,
news.time,
count(news_comments.news_id)
FROM news LEFT JOIN users ON users.id = news.author_id
LEFT JOIN news_comments ON news_comments.news_id = news.id
WHERE news.category = '1'
GROUP BY news.id DESC LIMIT
Только выводить не очень удобно...
- Код: Выделить всё • Развернуть
$row['count(news_comments.news_id)'];
Зато работает