代码之家  ›  专栏  ›  技术社区  ›  superUntitled

PHP:MYSQL计数查询与链接表

  •  1
  • superUntitled  · 技术社区  · 15 年前

    我正在寻找一个更干净的方法来做到这一点。我的代码可以工作,但我知道它可以更好。我有三个表:一个是类别组列表,一个是链接到类别组的类别列表,另一个是链接到类别的新闻故事列表。

    我有三个表格:类别组、类别、新闻。

    $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 回复  |  直到 15 年前
        1
  •  3
  •   Alex Martelli    15 年前

    为什么不加入表格呢?

    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
    

        2
  •  2
  •   Bill Karwin    15 年前

    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