Подобные SQL-запросы, возвращающие разные результаты - PullRequest
1 голос
/ 01 января 2011

Вот SQL-запросы:

$sql1 = "SELECT count(thread) AS total 
          FROM comments
          WHERE thread=1
          AND parent_id=0
          ";

$sql2 = "SELECT count(thread) AS total 
          FROM comments, users 
          WHERE thread=1
          AND parent_id=0
          AND users.user_id=comments.user_id 
          ";

$sql3 = "SELECT comments.*, users.username AS username
        FROM comments, users 
        WHERE thread=1
        AND parent_id=0
        AND users.user_id=comments.user_id 
        ORDER BY date
        LIMIT 10, 5
        ";

Мой вопрос: почему $ sql1 и $ sql2 будут возвращать два разных результата?

$ sql1 возвращает 61 строку

$ sql2 возвращает 56 строк

5-я строка в $ sql2 предназначена только для тестирования, не требуется, это всего лишь вариант $ sql1, который получает общее количество строк для нумерации страниц.

Ответы [ 3 ]

2 голосов
/ 01 января 2011

Видимо, некоторые комментарии были созданы пользователями, которых больше не существует.Таким образом, из 61 строки в таблице comments , соответствующей критериям потока / родителя, 56 имеют идентификатор пользователя, который записан в таблице users , а 5 имеют идентификатор пользователя, который являетсяне записано в таблице users .Это говорит о том, что вам нужно добавить ограничение внешнего ключа в таблицу comments , которая ссылается на таблицу users (что потребует ограничения первичного ключа для вашей таблицы users ).

2 голосов
/ 01 января 2011

Некоторые комментарии не принадлежат активному пользователю?

Do:

SELECT count(*)
FROM comments
WHERE thread=1
AND parent_id=0
AND NOT EXISTS (SELECT 1 FROM users
                WHERE users.user_id=comments.user_id)

Это возвращает> 0?

0 голосов
/ 01 января 2011

$sql2 называется " внутренним соединением ". Как указывает DVK, внутренние объединения не возвращают строки из таблицы, если в другой таблице нет строк, соответствующих условию соединения (users.user_id=comments.user_id). левое соединение из comments с users в этом случае будет соответствовать всем строкам таблицы comments, которые сопоставляются в $ sql1, а столбцы, взятые из users, устанавливаются в NULL, когда нет не соответствует строка из users.

-- equivalent to $sql2
SELECT count(c.thread) AS total 
  FROM comments AS c
    INNER JOIN users ON users.user_id=comments.user_id 
  WHERE c.thread=1
   AND c.parent_id=0

-- should return same total as $sql1
SELECT count(c.thread) AS total 
  FROM comments
    LEFT JOIN users AS u ON u.user_id=c.user_id 
  WHERE c.thread=1
   AND c.parent_id=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...