2009-05-02 2 views
1

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

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

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

У меня есть набор запросов. Первые запросы все строки из таблицы 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

Я предлагаю вам получить книгу о SQL, такую ​​как «SQL Queries for Mere Mortals».

$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 отличается от предыдущей строки.

+0

yup. взял меня второй взгляд на это, чтобы понять это, потому что он меня немного смутил. – DForck42

3

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

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 

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

Смежные вопросы