PHP пока цикл не проходит по всем выбранным записям из базы данных MySQL - PullRequest
1 голос
/ 04 августа 2011

В моем блоге три таблицы: одна для пользователей, одна для комментариев и одна для тем. Не все извлеченные записи отражаются в 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);

Спасибо за чтение!

Ответы [ 4 ]

2 голосов
/ 04 августа 2011

Я считаю, что проблема в том, что ваши GROUP BY заставят уничтожить NULL с.

Я обычно использую подзапрос в этих обстоятельствах просто потому, что его легче читать и понимать:

SELECT (select count(*) from Topics T where T.MemberID = U.id) AS NumberOfTopics,
    Users.id, Users.FirstName, Users.LastName, Users.Joined 
FROM Users u
0 голосов
/ 04 августа 2011

Ваш запрос кажется неверным.
Я бы использовал внутреннее объединение

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
0 голосов
/ 04 августа 2011

Ваш запрос несколько противоречив.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
0 голосов
/ 04 августа 2011

Я думаю, это из-за вашей группы.

Попробуйте:

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

Это должно собрать количество тем, которые вы ищете в подзапросе, а затем присоединиться к темрассчитывает против всех пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...