PHP: MYSQL COUNT запрос со связанными таблицами - PullRequest
1 голос
/ 02 мая 2009

Я ищу более чистый способ сделать это. Мой код работает, но я знаю, что он может быть лучше. У меня есть три таблицы: одна со списком групп категорий, одна со списком категорий, связанных с группами категорий, и одна со списком новостей, связанных с категориями.

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

У меня есть три таблицы: КатегорияГруппы, Категории, Новости.

У меня есть набор запросов. Первый запрос всех строк из таблицы CategoryGroups:

$result = mysql_query( '
SELECT cat_group_id, cat_group_name FROM CategoryGroups 
' );

Второй запрос находится внутри зацикленных результатов первого запроса и находит все категории, в которых есть новость и которые связаны с определенной группой категорий:

<?php
while( $row = mysql_fetch_assoc( $result ) ){
    $id = $row['cat_group_id'];     
    $name = $row['cat_group_name'];

echo "<h3>$name</h3>";

    $sql =  mysql_query("
            SELECT  category_id, title FROM `Categories`  
            WHERE cat_group_id = $id 
            AND category_id IN 
            (SELECT news.category_id FROM news)
            "); 
    while( $row = mysql_fetch_assoc($sql) ) {
    $title = $row['title'];
    $catid = $row['category_id'];
    $numbers =  mysql_query("
                SELECT * FROM news 
                WHERE category_id =$catid"
                );
    $nums = mysql_num_rows($numbers);
    echo "$title ($nums)<br/>\n";
}
?>

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

спасибо.

Ответы [ 2 ]

3 голосов
/ 02 мая 2009

Почему бы не присоединиться к столам?

SELECT cat_group_name, title, count(newsid)
FROM CatagoryGroups
INNER JOIN Categories ON cat_group_id
INNER JOIN News ON category_id
GROUP BY cat_group_name, title

похоже, что оно должно быть близко, если в таблице news есть столбец newsid (он должен иметь НЕКОТОРЫЙ первичный ключ, верно? С очевидными индексами JOIN должны быть довольно быстрыми, и ваш PHP-код может делать любое выходное форматирование, которое вам может понадобиться из этого.

2 голосов
/ 02 мая 2009

Я предлагаю вам получить книгу по SQL, например, " SQL-запросы для простых смертных ." *

$sql = mysql_query("
        SELECT  cg.cat_group_name, c.title, COUNT(n.category_id) AS NumNews
        FROM `CategoryGroups` cg 
        JOIN `Categories` c USING (cat_group_id)
        JOIN `News` n USING (category_id)
        GROUP BY cg.cat_group_name, c.title");

Затем зациклите результат и выведите новый <h3> каждый раз, когда cat_group_name отличается от предыдущего ряда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...