我正在寻找一种更清洁的方法来做到这一点。我的代码有效,但我知道它可以更好。我有三个表:一个包含类别组列表,一个包含链接到类别组的类别列表,另一个包含链接到类别的新闻报道列表。
我需要遍历类别组的所有名称,然后是类别组中类别的名称,并列出每个类别中的新闻报道数。
我有三个表: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";
}
?>
我想将此限制为一两个查询,并考虑到效率。我知道这可以做到,但是我的尝试并没有成功。
感谢。
答案 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
。