За последние 24 часа нас посетили 26650 программистов и 1511 роботов. Сейчас ищут 954 программиста ...

3 запроса в 1

Тема в разделе "MySQL", создана пользователем Freakmeister, 5 июн 2012.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Ребят, помогите упростить цикл вывода новостей. В очень упрощённом виде код выглядит так:

    Код (Text):
    1. $query = mysql_query("SELECT * FROM `portal_news` ORDER BY `date` DESC LIMIT 20", $db);
    2. while ($row = mysql_fetch_array($query)) {
    3.  
    4.     //проверяем, голосовал ли уже человек за новость
    5.     $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);
    6.     $voteble = mysql_num_rows($query1);
    7.     if ($voteble > 0) { $voteble=''; } else { $voteble=' voteble'; }
    8.  
    9.     //вытаскиваем название категории по её id
    10.     $query2 = mysql_query("SELECT title FROM `portal_categories` WHERE (`module`='news') AND (id='{$row['category']}') LIMIT 1", $db);
    11.     $row2 = mysql_fetch_array($query2);
    12.  
    13.     //вытаскиваем имя автора новости по его id
    14.     $query3 = mysql_query("SELECT username FROM `phpbb_users` WHERE user_id='{$row['author']}' ", $db);
    15.     $row3 = mysql_fetch_array($query3);
    16.  
    17.     //вывод
    18.     $output.='
    19.         <h2>'.$row['title'].'</h2>
    20.         <h4>Категория: '.$row2['title'].'</h4>
    21.         <div class="rating'.$voteble.'"></div>
    22.         <div class="content">'.$row['content'].'</div>
    23.         <p>Автор новости: '.$row3['username'].'</p>
    24.     ';
    25. }
    26.  
    27. echo $output;
    Как тут можно объединить запросы $query1, $query2 и $query3 в один? В идеале к ним бы ещё конечно и $query прилепить, но мне сейчас хотя бы с этими тремя разобраться.
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Почитай мануал MySQL про JOIN. Здесь несложно оставить всего один запрос, который вернёт список новостей, а также их авторов, голоса и названия категорий.

    Добавлено спустя 1 минуту 8 секунд:
    Кстати, так MSSQL или MySQL? А то в названии темы MS, а в коде - mysql_query :)
     
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    MySQL. Не знаю зачем эту тему перенесли в этот раздел.
     
  4. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Почитал мануал по джойн, посмотрел топорные примеры, но так и не смог составить правильный запрос для своего случая. Да и примеры в основном описывают для двух запросов, а не для трёх. Кто-нибудь может накатать наглядный пример, как сделать запрос сразу к трём таблицам с параметрами WHERE в каждом? Не обязательно с моим кодом, я попробую сделать по аналогии.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну типа такого, наверно:
    Код (Text):
    1. SELECT
    2.     `tab1`.`id`, `tab1`.`fld1`, `tab1`.`fld2`,
    3.     `tab2`.`id`, `tab2`.`fld21`, `tab2`.`fld22`,
    4.     `tab3`.`fld31`
    5. FROM
    6.     `tab1`,
    7.     INNER JOIN `tab2` ON (`tab2`.`tab1_id` = `tab1`.`id`)
    8.     INNER JOIN `tab3` ON (`tab3`.`tab2_id` = `tab2`.`id`)
    9. WHERE
    10.     `tab1`.`fld3` LIKE '%some_string%'
    11.     AND `tab2`.`fld25` > 11 AND `tab2`.`fld25` < 25
    12.     AND `tab3`.`fld33` = 'ok'
    13. ORDER BY
    14.     `tab2`.`fld23` ASC
    15. LIMIT 30, 15;