SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 03.07.2013 18:06:03

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

помогите оптимизировать запрос

Сделал запрос на выборку ответов на комментарии пользователей. Запрос работат, но даже я понимаю, что он мягко говоря говнокодерский((

<?php
$result55 = mysql_query("SELECT * FROM `comments_note` WHERE `id_user` = '{$myrow_user['id']}' and `id_note` NOT IN ( SELECT id FROM `notes` WHERE `id_user` = '{$myrow_user['id']}' )", $db );
$blocks = 0;
$current_unix = time();
while( $myrow55 = mysql_fetch_array( $result55 ) )
{
    $blocks++;
?>




<?php
$result555 = mysql_query("SELECT
    `comments_note`.*,
    `notes`.
    `id_user`
   
FROM
    `comments_note`,
    `notes`
WHERE
           `comments_note`.`parent_id` = '{$myrow55['id']}'
    AND
    `notes`.`id` = `comments_note`.`id_note`
    AND
    `comments_note`.`id_user` != '{$myrow55['id_user']}'
    AND
    `comments_note`.`view_reply` = '1' GROUP BY `comments_note`.`parent_id`"
, $db );
   
if (mysql_num_rows($result555) > 0)

{
$myrow555 = mysql_fetch_array($result555);

do {

$m2 = mysql_query("SELECT COUNT(*) FROM comments_note WHERE `parent_id` = '{$myrow55['id']}' and `id_user` != '{$myrow55['id_user']}' and `view_reply` =  '1' GROUP BY parent_id");
$m2 = mysql_fetch_array($m2);
$m2 = $m2[0];
$words2=Array("новый ответ", "новых ответа", "новых ответа");

printf ('<div class="note_com_sp">%s - <a href="/note.php?id=%s&note=%s#comment%s">%s %s</a></div>', $myrow55['comment'], $myrow555['id_user'], $myrow555['id_note'], $myrow55['id'], $m2, num3word($m2,$words2));
               
}
while ($myrow555 = mysql_fetch_array ($result555));
}
else echo "<h3 class='grey'>ТУТ МОЖНО УВИДЕТЬ СКОЛЬКО ВСЕГО КОММЕНТАРИЕВ У ПОЛЬЗОВАТЕЛЯ И СКОЛЬКО ЗАПРОС ПО КРУГУ ПРОРАБОТАЕТ В ПУСТУЮ</h3>";
?>


<?php
}

if( ! $blocks )
{
    ?>
<h3 class="grey">Новых ответов на комментарии пока нет.</h3>
    <?php
}
?>


структура таблицы такая
id              parent_id     id_note     id_user      comment              date_add     moder     view     view_reply
43             0               73    291        Красивый стих             2013-07-03 16:34:38    0   
42             34               76    11501        Точно-точно2             2013-07-03 15:59:45    0    1    1
41             32               76    11501        Точно-точно!             2013-07-03 15:59:14    0    1    1
40             0               68    291        А вилки нашли?)))      2013-07-02 18:50:37    0    1   
39            0               77    291        Молодец Влад             2013-07-02 18:17:48    0    1

Первый запрос выбирает все комментарии который оставлял пользователь (`id_user` = '{$myrow_user['id']}') и выбирает из таблицы с заметками, собственный заметки `id_note` NOT IN ( SELECT id FROM `notes` WHERE `id_user` = '{$myrow_user['id']}' ) для их исключения...
если такие комментарии существуют, то далее в цикле мы имем есть ли в таблице родительные комментарий на комментарий пользователя `comments_note`.`parent_id` = '{$myrow55['id']}', `notes`.`id` = `comments_note`.`id_note`для того что бы вытащить id автора комментария, `comments_note`.`id_user` != '{$myrow55['id_user']}' для того что бы не вытаскивать ответы на свои собственный комментарии, и наконец вытаскиваем не прочитанные ответы на комментарии `comments_note`.`view_reply` = '1'...

если ответов нет, либо они прочитанные, то второй (вложенный запрос) ничего не выведет, а вот первый будет перелапачивать все комментарии пользователя, к примеру 1000 и соответственно 1000 раз проработает цикл!??

Подскажите насколько правильный или нет такой код? Можно ли его оптимизировать... Может кто сможет мне помочь с этим, возможно за вознагрождение?

Неактивен

 

#2 03.07.2013 18:07:40

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: помогите оптимизировать запрос

хочеться верить что может в нем не так уж все и страшно и его просто можно чуть подкорректировать?)

Неактивен

 

#3 04.07.2013 16:21:37

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: помогите оптимизировать запрос

все так плохо?)) отзоваитесь кто нибудь пожалуйста

Неактивен

 

#4 04.07.2013 16:42:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: помогите оптимизировать запрос

Какие проблемы с этим кодом и чего хотите от него добиться? Непонятно что решит просто переписывание этого куска.

Неактивен

 

#5 04.07.2013 18:03:27

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: помогите оптимизировать запрос

с этим кодом в плане работоспособности никаких нет со стороны пользователя... а вот с моей стороны меня беспокоит не правильное его постороение, а именно "если ответов нет, либо они прочитанные, то второй (вложенный запрос) ничего не выведет, а вот первый будет перелапачивать все комментарии пользователя, к примеру 1000 и соответственно 1000 раз проработает цикл!??"

Неактивен

 

#6 04.07.2013 18:10:33

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: помогите оптимизировать запрос

Да, делать MySQL-запрос внутри цикла PHP редко оправдано. Термин "вложенный запрос" к этому случаю не применим - его используют для подзапросов внутри запроса. Попробуйте переписать все одним запросом через JOIN.

Неактивен

 

#7 04.07.2013 19:04:30

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: помогите оптимизировать запрос

Вот и я про это что не оправдано... но к сожалению, то что я слепил, это максимум моих знаний. rgbeast, может вы или кто еще откликниться помочь мне переписать этот запрос на основе этого, это возможно? я готов оплатить работу

Неактивен

 

#8 09.07.2013 06:44:08

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: помогите оптимизировать запрос

У нас есть стандартная услуга http://sqlinfo.ru/services/ , пишите.

Неактивен

 

Board footer

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