PHP:带链接表的MYSQL COUNT查询

时间:2009-05-02 02:15:21

标签: php mysql

我正在寻找一种更清洁的方法来做到这一点。我的代码有效,但我知道它可以更好。我有三个表:一个包含类别组列表,一个包含链接到类别组的类别列表,另一个包含链接到类别的新闻报道列表。

我需要遍历类别组的所有名称,然后是类别组中类别的名称,并列出每个类别中的新闻报道数。

我有三个表:CategoryGroups,Categories,News。

我有一组查询。第一个查询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 个答案:

答案 0 :(得分: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列(它必须有一些主键,对吧?好吧,算一下;-)。使用明显的索引,JOIN应该非常快,并且您的PHP代码可以执行您可能需要的任何输出格式。

答案 1 :(得分: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