【问题标题】:PHP While Loop Isn't Running Through All Selected Records From MySQL DatabasePHP While Loop 没有遍历 MySQL 数据库中的所有选定记录
【发布时间】:2011-10-19 22:11:29
【问题描述】:

我在博客下面有三张表:一张用于用户,一张用于 cmets,一张用于线程。 并非所有检索到的记录都由 PHP 回显,我认为这可能与 NULL 值有关,例如在我的成员列表页面上,以下查询检索了四个用户的数据:

SELECT COUNT(Topics.MemberID) AS NumberOfTopics, Users.id, 
    Users.FirstName, Users.LastName, Users.Joined 
FROM Users LEFT JOIN Topics ON Users.id=Topics.MemberID GROUP BY Topics.MemberID

但是,如果列表末尾的最后一个用户没有主题 (NumberOfTopics = 0),则不会显示它们。 如果用户的帖子计数为 0,但他们关注的记录的帖子计数不为 0,则显示该用户。为什么?

完整代码如下:

$result = mysql_query("SELECT COUNT(Topics.MemberID) AS NumberOfTopics, ".
                      "Users.id, Users.FirstName, Users.LastName, Users.Joined ".
                      "FROM Users LEFT JOIN Topics ON Users.id=Topics.MemberID ".
                      "GROUP BY Topics.MemberID") 
             or die("Query failed with error: ".mysql_error());

echo "<table border='1'>
<tr>
<th>Name</th>
<th>Joined</th>
<th>No. of posts</th>
</tr>";

while($row = mysql_fetch_assoc($result))
  {
  echo "<tr>";
  echo "<td><a href='/neuro/profile.php?userid=$row[id]'>" . 
       $row['FirstName'] . " " . $row['LastName'] . "</a></td>";
  echo "<td>" . $row['Joined'] . "</td>";
  echo "<td>" . $row['NumberOfTopics'] . "</td>";
  echo "</tr>";
  }
echo "</table>";

mysql_close($con);

感谢阅读!

【问题讨论】:

  • 也许您应该在Users.id 上分组,因为没有主题的用户将没有Topics.MemberID 可以分组?
  • 您是否在 phpmyadmin 或类似工具中检查过您的 SQL?
  • Miles,如果您可以选择其中一个答案作为“已接受的答案”,我们将不胜感激。为此,请单击带有箭头的数字下方的复选标记。这让系统知道您已收到答案并对此感到满意。 :)

标签: php mysql database while-loop


【解决方案1】:

您的查询似乎不正确。
我会使用内部连接

SELECT COUNT(*) AS NumberOfTopics
  , Users.id
  , Users.FirstName
  , Users.LastName
  , Users.Joined 
FROM Users 
INNER JOIN Topics ON Users.id=Topics.MemberID 
GROUP BY Topics.MemberID

【讨论】:

    【解决方案2】:

    您的查询有些矛盾。 LEFT JOIN 将返回左表中的所有行,即使右表中没有匹配项。但是,在您的查询中,您将按 Topics.MemberID 对记录进行分组。对于没有帖子的用户,他们将不会显示任何记录!!尝试以下查询:

    SELECT 
    COUNT(Topics.MemberID) AS NumberOfTopics, Users.id, 
    Users.FirstName, Users.LastName, Users.Joined 
    FROM Users LEFT JOIN Topics ON Users.id=Topics.MemberID 
    GROUP BY Users.id
    

    【讨论】:

      【解决方案3】:

      我想是因为你的group by。

      试试:

      select
          topics.count,
          users.id,
          users.firstname,
          users.lastname,
          users.joined
      from
          users left join
          (
              select
                  topics.memberid,
                  count(*) count
              from
                  topics
              group by
                  topics.memberid
          ) topics on users.id = topics.memberid
      

      这应该收集您在子查询中关注的主题数量,然后将这些数量加入所有用户。

      【讨论】:

        【解决方案4】:

        我认为问题在于您的GROUP BY 将强制消除NULLs。

        我通常会在这些情况下使用子查询,因为它更容易阅读和理解:

        SELECT (select count(*) from Topics T where T.MemberID = U.id) AS NumberOfTopics,
            Users.id, Users.FirstName, Users.LastName, Users.Joined 
        FROM Users u
        

        【讨论】:

        • 感谢您的帮助和建议
        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 1970-01-01
        • 2019-12-11
        相关资源
        最近更新 更多