Оптимизация кол-ва запросов

Разработка своих веб-приложений и страничек

Оптимизация кол-ва запросов

Сообщение Zver » 30 янв 2010, 07:26

Вообщем, имеется таблица в БД - news, в не поля id, .... , author. Так вот author - INT, т.е. указывается ID автора. И что бы вывести автора новости нужно для каждой новости делать дополнительне запросы. Как можно оптимизировать эту систему? И нельзя ли всё сделать одним запросом? (вывод авторов)
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Re: Оптимизация кол-ва запросов

Сообщение Rostov114 » 30 янв 2010, 07:52

Код в студию...

Но чую что можно все решить LEFT JOIN запросами.
Некоммерческий проект «HSDN»
Аватара пользователя
Rostov114
Автор
 
Сообщения: 3197
Зарегистрирован: 18 окт 2007, 02:21

Re: Оптимизация кол-ва запросов

Сообщение Zver » 30 янв 2010, 08:31

Функция для вывода автора
Код: Выделить всёРазвернуть

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;
    }
}
 


ЗЫ: Я не когда не работал со сложными запросами) так что сильно не бить)
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Re: Оптимизация кол-ва запросов

Сообщение Zver » 30 янв 2010, 13:38

R144, идеи есть?...
Оффтоп:
Не, ну это наглость :D
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Re: Оптимизация кол-ва запросов

Сообщение Zver » 30 янв 2010, 14:58

Помозговав, додумался сам :Yahoo!:
Код: Выделить всёРазвернуть

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


Вот как теперь мне подсчитать кол-во комментариев к новости этим же запросом?
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Re: Оптимизация кол-ва запросов

Сообщение Rostov114 » 30 янв 2010, 18:34

Zver писал(а):Вот как теперь мне подсчитать кол-во комментариев к новости этим же запросом?

:D Добавить еще один LEFT JOIN запрос.
Некоммерческий проект «HSDN»
Аватара пользователя
Rostov114
Автор
 
Сообщения: 3197
Зарегистрирован: 18 окт 2007, 02:21

Re: Оптимизация кол-ва запросов

Сообщение Zver » 30 янв 2010, 19:18

Добавил, он мне бред выводит:

Код: Выделить всёРазвернуть

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();, появляется два одинаковых массива... :(
Последний раз редактировалось Zver 30 янв 2010, 19:20, всего редактировалось 1 раз.
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Re: Оптимизация кол-ва запросов

Сообщение Rostov114 » 30 янв 2010, 19:20

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


Новости дублируются, каким то путём. Смотрел через print_r();, появляется два одинаковых массива... :(

Может стоить заменить ORDER BY на GROUP BY?
Некоммерческий проект «HSDN»
Аватара пользователя
Rostov114
Автор
 
Сообщения: 3197
Зарегистрирован: 18 окт 2007, 02:21

Re: Оптимизация кол-ва запросов

Сообщение Zver » 30 янв 2010, 19:29

Всё, огромное спасибо! ^^
Подсчёт комментариев додумался сделать 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)'];
 

Зато работает :D
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Re: Оптимизация кол-ва запросов

Сообщение Rostov114 » 30 янв 2010, 19:37

Код: Выделить всёРазвернуть

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) AS count_comments
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_comments'];
  


Нэ?
Некоммерческий проект «HSDN»
Аватара пользователя
Rostov114
Автор
 
Сообщения: 3197
Зарегистрирован: 18 окт 2007, 02:21

След.

Вернуться в PHP, HTML, CSS...

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

cron