我是一名前端开发人员,请怜悯我的灵魂以获取可怕的PHP和SQL,我在这里学习!
所以,我有几张桌子,让他们打电话给他们"类别"和"帖子"
我的"类别" table包含以下字段:
我的"帖子" table包含以下字段:
我可以非常简单地输出我的所有类别:
$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是否合理,或者错过了一种更容易/更清洁的方式来做我正在做的事情?
提前致谢:)
答案 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";
}