SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.06.2012 17:09:53

Freakmeister
Участник
Зарегистрирован: 07.06.2012
Сообщений: 3

3 запроса в 1

Ребят, помогите упростить цикл вывода новостей. Читал мануалы по JOIN, читал топорные статьи с примерами, но так и не смог составить правильный запрос для своего конкретного примера. В очень упрощённом виде код выглядит так:

$query = mysql_query("SELECT * FROM `portal_news` ORDER BY `date` DESC LIMIT 20", $db);
    while ($row = mysql_fetch_array($query)) {

        //проверяем, голосовал ли уже человек за новость
        $query1 = mysql_query("SELECT id FROM `portal_votes` WHERE (`module`='news') AND (`id_entry`='{$row['id']}') AND (`id_member`='{$user->data['user_id']}') LIMIT 1", $db);
        $voteble = mysql_num_rows($query1);
        if ($voteble > 0) { $voteble=''; } else { $voteble=' voteble'; }

        //вытаскиваем название категории по её id
        $query2 = mysql_query("SELECT title FROM `portal_categories` WHERE (`module`='news') AND (id='{$row['category']}') LIMIT 1", $db);
        $row2 = mysql_fetch_array($query2);

        //вытаскиваем имя автора новости по его id
        $query3 = mysql_query("SELECT username FROM `phpbb_users` WHERE user_id='{$row['author']}' ", $db);
        $row3 = mysql_fetch_array($query3);

        //вывод
        $output.='
            <h2>'
.$row['title'].'</h2>
            <h4>Категория: '
.$row2['title'].'</h4>
            <div class="rating'
.$voteble.'"></div>
            <div class="content">'
.$row['content'].'</div>
            <p>Автор новости: '
.$row3['username'].'</p>
        '
;
    } //конец цикла while

    echo $output;


Как тут можно объединить запросы $query1, $query2 и $query3 в один? В идеале к ним бы ещё конечно и $query прилепить, но мне сейчас хотя бы с этими тремя разобраться.

Отредактированно Freakmeister (07.06.2012 17:10:22)

Неактивен

 

#2 07.06.2012 22:03:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: 3 запроса в 1

Freakmeister написал:

Как тут можно объединить запросы $query1, $query2 и $query3 в один? В идеале к ним бы ещё конечно и $query прилепить, но мне сейчас хотя бы с этими тремя разобраться.

А зачем?

Неактивен

 

#3 08.06.2012 00:45:40

Freakmeister
Участник
Зарегистрирован: 07.06.2012
Сообщений: 3

Re: 3 запроса в 1

Для скорости работы скрипта.) Чтобы при выводе 20 новостей, в цикле он делал 20 запросов, а не 60. Ну и самое главное, научиться хочу делать такие вещи.

Неактивен

 

#4 08.06.2012 00:48:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: 3 запроса в 1

Вы действительно считаете, что скорость работы скрипта уменьшится от того, что Вы три запроса в один превратите? Это совершенно не обязательно, в данном случае уж точно.
Ну а если уж так хочется объединить в один результаты запросов - смотрите в сторону UNION.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 09.06.2012 10:01:24

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: 3 запроса в 1

vasya , deadka

А из каких соображений, невыгодно объединить то в один запрос ?
В старом варианте, PHP ведь действительно делает 60 запросов.

SELECT n.*,COUNT(v.id) 'votes',c.title,u.username
FROM `portal_news` n
JOIN `portal_votes` v on(n.id=v.`id_entry` AND n.user_id=v.`id_member` AND v.`module`='news')
JOIN `portal_categories` c on(n.category=c.`id` AND c.`module`='news')
JOIN `phpbb_users` u on(n.author=u.user_id)
GROUP BY n.user_id ORDER BY n.`date` DESC LIMIT 20
 


P.S. Запрос можно еще оптимизировать.

Отредактированно evgeny (09.06.2012 10:03:56)

Неактивен

 

#6 09.06.2012 12:59:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: 3 запроса в 1

evgeny, джоины ведь тоже чего-нибудь да стоят, особенно в том количестве, что в твоём запросе. А запросы у топикстартера вполне себе шустро будут работать, если составные индексы хорошо расставить.  60 их - ну и что с того, подключения-то к базе каждый раз не происходит.

vasya, твоя очередь smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 09.06.2012 13:53:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: 3 запроса в 1

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

Неактивен

 

#8 10.06.2012 00:02:55

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: 3 запроса в 1

deadka, vasya
Да, это тема уже обсуждалась много раз. Да не спорю что тупо соединять все в один запрос это далеко не всегда эффективный вариант.
Но граница ведь тоже где та должна быть ? 100, 200, 1000 не зависимых запросов ? :-)
Просто мне этот случай мне да показался приближающийся к той самой границе ...

Неактивен

 

#9 16.06.2012 13:00:04

Freakmeister
Участник
Зарегистрирован: 07.06.2012
Сообщений: 3

Re: 3 запроса в 1

Ну вы меня озадачили... Я всегда думал, что чем меньше запросов к БД, тем быстрее выполняется скрипт. Надо будет это дело потестить. А вообще, чисто с технической стороны, в цикле

while ($row = mysql_fetch_array($query)) { }
что происходит? Каждый оборот цикла делается запрос к БД по переменной $query, или запрос происходит всего раз, перед циклом, а сам цикл уже обрабатывает PHP?

Неактивен

 

#10 16.06.2012 15:58:41

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: 3 запроса в 1

Freakmeister написал:

Ну вы меня озадачили... Я всегда думал, что чем меньше запросов к БД, тем быстрее выполняется скрипт.

А представьте, что вы в одном запросе все данных из всех таблиц вытащили. Уверены, что быстрее получится wink?

Freakmeister написал:

А вообще, чисто с технической стороны, в цикле

while ($row = mysql_fetch_array($query)) { }
что происходит? Каждый оборот цикла делается запрос к БД по переменной $query, или запрос происходит всего раз, перед циклом, а сам цикл уже обрабатывает PHP?

Запрос происходит перед циклом, а mysql_fetch_array просто вытаскивает очередную строку из уже полученного из базы набора строк.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson