Помогите с запросом

Тема в разделе "Базы данных", создана пользователем yeaahhh, 31 окт 2011.

Модераторы: latteo
  1. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Друзья, очень прошу, подскажите, как построить правильно следующий запрос.
    Есть 2 таблицы
    dle_want
    ---------------------
    idnews | email
    ---------------------

    и dle_wantcalc
    ---------------------
    idnews | newscalc
    ---------------------


    Необходимо из таблицы dle_wantcalc вывести все записи
    и параллельно подсчитать из таблицы dle_want, сколько email с dle_wantcalc.idnews = dle_want.idnews


    Делаю вот так
    PHP:
    $db->query( "SELECT idnews, newscalc FROM dle_wantcalc WHERE newscalc != '0' ORDER BY newscalc DESC" );

        while ( $row = $db->get_row() ) {
    $n++;

    $sks = $db->super_query( "SELECT COUNT(email) as count FROM dle_want WHERE idnews = '".$row['idnews']."'" );
        $listtv.$n = $sks['count'];

    ?>
    <tr>
                                <td style="padding: 2px;" width="150"><?=$n;?></td>
                                <td align="left" width="300"><a href="/index.php?newsid=<?=$row['idnews'];?>" target="blank_"><?=$row['tit'];?></a></td>
                                <td align="left" width="150"><?=$row['newscalc'];?></td>
    <td align="left" width="150"><?=$listtv.$n;?></td>
                                <td width="200">
    Обнулить
    </td>
                            </tr>


    <? } 
    $db->free();
    Но обрабатывается только 1 цикл..
    Хотя записей в таблице dle_want много..
    Помогите, пожалуйста. Заранее огромное спасибо.
     
  2. jami

    jami Постоялец

    Регистр.:
    10 авг 2011
    Сообщения:
    114
    Симпатии:
    39
    Если я правильно понял задачу, тут можно обойтись одним запросом join + group by:
    HTML:
    SELECT n.idnews, n.newscalc, COUNT(e.idnews) FROM dle_want e, dle_wantcalc n WHERE n.idnews=e.idnews GROUP BY e.idnews
    Как-то так, полностью на работоспособность не проверял.
     
  3. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    jami, а как вывести кол-во, полученное в COUNT(e.idnews), не подскажете?
     
  4. jami

    jami Постоялец

    Регистр.:
    10 авг 2011
    Сообщения:
    114
    Симпатии:
    39
    Не понял вопроса.
    Вышеуказанный запрос выведет отдельной колонкой COUNT(e.idnews) - для каждого idnews результат join+группировки (т.е. число email'ов), что и требовалось получить, вроде. Либо формулируйте вопрос точнее :)

    ЗЫ. Делать 100500 запросов GROUP BY через php , как в изначальном коде - намного медленее, чем один GROUP BY с JOIN.
     
  5. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Проще говоря, необходимо посчитать кол-во email в таблице dle_want, которые имеют idnews из таблицы dle_wantcalc..
     
  6. AutoRun

    AutoRun Создатель

    Регистр.:
    8 окт 2011
    Сообщения:
    22
    Симпатии:
    5
    может получится если заменить "COUNT(e.idnews)" на "COUNT(e.idnews) AS `kolvo`"
     
  7. Antony_

    Antony_ Писатель

    Регистр.:
    21 фев 2012
    Сообщения:
    4
    Симпатии:
    0
    Код:
    SELECT n.idnews, n.newscalc, COUNT(e.idnews) FROM dle_want e inner join dle_wantcalc n  on n.idnews=e.idnews GROUP BY e.idnews
     
  8. Funaki

    Funaki

    Регистр.:
    26 июн 2008
    Сообщения:
    151
    Симпатии:
    16
    мне кажется, что надо бы from заменить
    Код:
    FROM dle_wantcalc n LEFT JOIN dle_want e
    чтобы учесть нули