2009-05-02 16 views
1

Ich bin auf der Suche nach einem saubereren Weg, dies zu tun. Mein Code funktioniert, aber ich weiß, dass es besser sein kann. Ich habe drei Tabellen: eine mit einer Liste von Kategoriengruppen, eine mit einer Liste von Kategorien, die mit Kategoriengruppen verknüpft sind, und eine mit einer Liste von Nachrichten, die mit den Kategorien verknüpft sind.PHP: MYSQL COUNT Abfrage mit verknüpften Tabellen

Ich muss alle Namen der Kategoriegruppen durchlaufen, gefolgt von den Namen der Kategorien in den Kategoriengruppen, wobei auch die Anzahl der Nachrichtenartikel in jeder Kategorie aufgeführt wird.

Ich habe drei Tabellen: CategoryGroups, Categories, News.

Ich habe eine Reihe von Abfragen. Die ersten Anfragen alle Zeilen aus der CategoryGroups Tabelle:

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

Die zweite Abfrage innerhalb der geschleiften Ergebnisse der ersten Abfrage und findet alle Kategorien, die eine Nachricht haben und zu einer bestimmten Kategorie Gruppe verknüpft:

<?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"; 
} 
?> 

Ich möchte dies auf eine oder zwei Abfragen beschränken, mit Effizienz im Auge. Ich weiß, dass dies möglich ist, aber ich war nicht erfolgreich bei meinen Versuchen.

danke.

Antwort

2

Ich schlage vor, Sie müssen ein Buch über SQL, wie "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"); 

dann die Schleife über das Ergebnis und gibt ein neues <h3> jedes Mal, wenn der cat_group_name unterscheidet sich von der vorherigen Zeile.

+0

yup. nahm mich ein zweites Mal und sah es mir an, weil er mich etwas verwirrt hatte. – DForck42

3

Warum nicht die Tabellen JOIN?

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 

sieht aus wie es in der Nähe sein sollte, wenn Tabelle Nachrichten eine newsid Spalte (es muss hat einige Primärschlüssel haben, nicht wahr? Gut, dass zählen ;-). Mit den offensichtlichen Indizes sollten die JOINs ziemlich schnell sein, und Ihr PHP-Code kann die von Ihnen benötigte Ausgabeformatierung machen.