MySQL:如何返回表中的所有行,并从另一个表中计算具有匹配ID的行数

时间:2015-06-01 20:10:54

标签: php mysql count categories

我是一名前端开发人员,请怜悯我的灵魂以获取可怕的PHP和SQL,我在这里学习!

所以,我有几张桌子,让他们打电话给他们"类别"和"帖子"

我的"类别" table包含以下字段:

  • 的categoryID
  • 类别名称
  • categoryDisplayName

我的"帖子" table包含以下字段:

  • 帖子ID
  • postTitle
  • postCategoryID
  • otherNoneImportantFields

我可以非常简单地输出我的所有类别:

$getCategories = mysql_query("SELECT categoryID, name, displayName 
                              FROM jobCategories 
                              ORDER BY categoryID ASC");
$numberOfCategories = mysql_num_rows($getCategories);

然后我可以做一个while循环并输出所有类别:

if ($numberOfCategories > 0) {
    while($row = mysql_fetch_array($getCategories)) {
        $categoryID = $row['categoryID'];
        $name = $row['name'];
        $displayName = $row['displayName'];

        echo "<li>" . $displayName . "</li>";
        // I'm using the other variables to create a link
    }
}

现在,问题是: 我想在while循环中有一个变量,它是具有该categoryID的所有帖子的计数。我不确定我是否可以执行子查询,或者我是否必须进行连接才能将该变量输出。

作为第二个问题,问题的PHP是否合理,或者错过了一种更容易/更清洁的方式来做我正在做的事情?

提前致谢:)

2 个答案:

答案 0 :(得分:0)

这将返回您的jobCategories表,其中额外的列postsCount等于与行的categoryID匹配的帖子数。

SELECT categoryID, categoryName, categoryDisplayName, IFNULL(postsCounts.cnt, 0) AS postsCount
FROM jobCategories
LEFT JOIN (
  SELECT postCategoryID, count(*) as cnt
  FROM posts
  GROUP BY postCategoryID
) postCounts 
ON postCounts.postCategoryID = jobCategories.categoryID

答案 1 :(得分:0)

  

我可以非常简单地输出我的所有类别

即使您的数据库中有一百万行?

是的,您可以执行子查询或联接。重要的是不要在循环中生成第二个SQL脚本并继续执行它(因为这将非常不足)。

子查询:

SELECT categoryID 
,   name
,   displayName
,   (SELECT COUNT(*)
     FROM posts
     WHERE posts.postCategoryID=jobCategories.categoryID
    ) AS countPosts 
FROM jobCategories 
ORDER BY categoryID ASC;

加入:

SELECT categoryID 
,   name
,   displayName
,   SUM(IF(jobCategories.categoryID IS NULL, 0, 1)) AS countPosts
FROM jobCategories 
LEFT JOIN posts
ON posts.postCategoryID=jobCategories.categoryID
GROUP BY categoryID 
,   name
,   displayName
ORDER BY categoryID ASC;
  

是有问题的PHP理智

除了记录数量的问题之外,你还不知道$ numberOfCategories而没有先运行查询 - 当if(){....}完全没有影响时,这是不必要的。脚本的行为。即使有一个else {} caluse,在迭代循环之后测试的情况可能会更有效率:

 $count=0;
 while($row = mysql_fetch_array($getCategories) && ++$count<100) {
    ...
 }
 if (!$count) {
    print "No data found";
 }