【问题标题】:While Loop echos only 1 value twiceWhile Loop 仅回显 1 个值两次
【发布时间】:2016-04-20 01:38:50
【问题描述】:

我在数据库中有两个名为 forums 和 forum_categories 的表

论坛类别
cat_id

论坛
cat_id

由于某种原因,我试图计算每个类别的总数,它会显示所有记录的总记录。

到目前为止,我在数据库中有 2 个类别

第一个类别的值为 1
第二个类别的值为 2

在第一类中,我有两个论坛的 cat_id 为 1
在第二类中,我有一个 cat_id 为 2 的论坛

它显示

类别 1 -------- 3 ---------------
类别 2 -------- 3 ---------------

什么时候显示

类别 1 -------- 2 ---------------
类别 2 -------- 1 ---------------

$topics_count 始终显示 3。

   $sql = "SELECT * FROM forum_categories, forums WHERE forum_categories.cat_id = forums.cat_id GROUP BY forum_categories.cat_id";
$result = query($sql);



$sql2 = "SELECT fc.cat_title COUNT(f.forum_id) FROM forums as f LEFT JOIN forum_categories fc ON (f.cat_id = fc.cat_id) GROUP BY f.cat_id";
$result2 = query($sql2);
$topics_count = count($result2);



while (($row = mysqli_fetch_assoc($result)) != false) {

    $cat_id = $row['cat_id'];
    $cat_title = $row['cat_title'];
    $forum_name = $row['forum_name']; 


    echo "<tr>";

    echo "<td>$cat_id</td>";
    echo "<td><a href='viewforum.php?f={$cat_id}'>$cat_title</a><br>$forum_name admin</td>";
    echo "<td>$topics_count</td>";
    echo "<td>0</td>";
    echo "</tr>";
}

【问题讨论】:

  • 可以给我们看一下表格数据吗?
  • 我认为您不应该从查询中获得 6 条记录。应该只有 3 个。
  • 这是一个 PHP 问题。您只是打印了两次结果集。
  • Tim Biegeleisen 不明白如何在不同的类别中将相同的结果打印 2 次​​span>
  • 在 PHPMyAdmin 中尝试查询,看看结果如何

标签: php


【解决方案1】:

下面这段代码给你所有的结果:

$sql2 = "SELECT * FROM forums WHERE cat_id = cat_id";
$result2 = query($sql2);
$topics_count = row_count($result2); // here this would be 3*

*在 cat1 为 2 + cat2 为 1 的情况下,您在每个表行中将其回显为:

echo "<td>$topics_count</td>";

因此,您会在两行中看到总数 (3)。

您真正尝试的是加入forumsforum_categories 表,获取forum_categories.cat_titleCOUNT(forums.cat_id),同时按forums.cat_id 对结果进行分组

SELECT
    fc.cat_title,
    COUNT(f.forum_id)
FROM forums as f
LEFT JOIN forum_categories fc ON (f.cat_id = fc.cat_id)
GROUP BY f.cat_id

这是我昨天发给你的同一个演示 fiddle

然后,您的查询将返回类似以下内容:

Demo Forum 1 | 2
Demo Forum 2 | 1

更新:

$sql2 = "SELECT
            fc.cat_id,
            fc.cat_title,
            f.forum_name,
            COUNT(f.forum_id) as count
        FROM forums as f
        LEFT JOIN forum_categories fc ON (f.cat_id = fc.cat_id)
        GROUP BY f.cat_id";

$result2 = query($sql2);

while (($row = mysqli_fetch_assoc($result)) != false) {

    $cat_id = $row['cat_id']; // category id
    $cat_title = $row['cat_title']; // category title
    $forum_name = $row['forum_name']; // forum name
    $count = $row['count']; // count of forum_id (grouped by cat_id)

    echo "<tr>";
    echo "<td>$cat_id</td>";
    echo "<td><a href='viewforum.php?f={$cat_id}'>$cat_title</a><br>$forum_name admin</td>";
    echo "<td>$count</td>";
    echo "<td>0</td>";
    echo "</tr>";

}

在这里,我很确定计数没问题,但不确定“论坛名称”。

【讨论】:

  • 与我的查询几乎相同,除了你有一个使用 SQLFiddle +1 的工作示例
  • 对@ash,我昨天试图向他解释,并且有冲动仍然发布这个答案,以防他现在能更好地理解。否则,你的也已经解决了。
  • @ash 只是为了表明我没有疯我更新了我的代码,结果从所有类别中的 3 变为所有类别中的 1
  • 我使用你的代码我得到你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 'COUNT(f.forum_id) FROM forums as f LEFT JOIN forum_categories fc ON (f.cat_id = ' at line 1
  • @William 我建议休息一下,清醒一下,然后返回调试它。如果您将最新的代码和结果添加为描述中的新部分,我仍然可以尝试提供更多帮助。
【解决方案2】:

试试这个

替换这个

while (($row = mysqli_fetch_assoc($result)) != false) {

有了这个

while ($row = mysqli_fetch_assoc($result)) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多