Подсчет записей MySQL с помощью LIMIT - PullRequest
6 голосов
/ 07 февраля 2011

Поскольку я пытаюсь подсчитать количество записей в таблице, даже если в операторе SQL содержится LIMIT, в целом все работает, как бы странно это ни происходило, код:

$sql = "SELECT COUNT(*) AS count FROM posts
        ORDER BY post_date DESC
        LIMIT 5";

// ... mysql_query, etc

while($row = mysql_fetch_array($result))
{
    // ... HTML elements, etc
    echo $row['post_title'];

    // ... HTML elements, etc

    echo $row['count']; // this displays the number of posts (which shows "12").
}

Хотя при отображении через цикл while он отображает следующее:

Примечание: неопределенный индекс: post_title в /Applications/MAMP/htdocs/blog/index.php в строке 55

Если я уберу COUNT(*) AS count, все будет отображаться идеально ... как получилось?

Ответы [ 8 ]

15 голосов
/ 07 февраля 2011

Не используйте COUNT(*) для подсчета количества строк (по многим причинам).Запишите полный запрос и добавьте SQL_CALC_FOUND_ROWS сразу после SELECT:

SELECT SQL_CALC_FOUND_ROWS id, title FROM foo LIMIT 5;

Затем, после того, как этот запрос будет выполнен (сразу после), выполните:

SELECT FOUND_ROWS();

Это вернет количество строк, которое вернул бы исходный SELECT, если бы у вас не было LIMIT в конце (учитывая все объединения и предложения where).

Это непереносимый, но очень эффективный (и ИМХО правильный способ решения проблем такого типа).

1 голос
/ 07 февраля 2011

То, что все пытаются сказать, это то, что вы должны использовать 2 отдельных запроса вместо 1 одного.

1) получить количество строк в таблице

$sql = "SELECT COUNT(*) AS count FROM posts;

2) получить последние 5 строк таблицы

$sql = "SELECT * FROM posts
        ORDER BY post_date DESC
        LIMIT 5";
1 голос
/ 07 февраля 2011

Это происходит потому, что COUNT() является агрегатной функцией.Вам нужно будет выполнить два отдельных запроса, чтобы получить и количество строк в таблице, и отдельные записи.

1 голос
/ 07 февраля 2011

LIMIT здесь ничего не делает, потому что вы выбираете один скаляр.Ошибка отображается из-за того, что вы не выбираете заголовок сообщения, поэтому он не указан в хеше $row.

0 голосов
/ 14 ноября 2012

У меня была такая же проблема, и я нашел эту статью: http://www.mysqldiary.com/limited-select-count/ лучший способ (особенно для больших столов) это использовать так:

SELECT COUNT(*) AS count FROM (SELECT 1 FROM posts
    ORDER BY post_date DESC
    LIMIT 5) t

теперь возвращает число от 0 до 5

0 голосов
/ 07 февраля 2011

Вы смешиваете агрегатную функцию COUNT() со стандартным выбором.Вы не можете получить точный заголовок сообщения без предложения GROUP BY в вашем совокупном запросе.Самое простое, что вы должны сделать, - это выполнить два запроса - один для вашего счета, другой для вашей информации.Кроме того, нет смысла использовать LIMIT в статистической функции без других столбцов в вашей (опущено) GROUP BY - текущий запрос всегда будет возвращать одну строку.

0 голосов
/ 07 февраля 2011

Включив COUNT(*) AS count, вы удалили фактические столбцы, из которых вы хотите получить информацию. Попробуйте использовать

SELECT *, COUNT(*) AS count FROM posts ORDER BY post_date DESC LIMIT 5

Этот запрос будет выполнять обе задачи, которые вы пытаетесь выполнить в одном запросе, но на самом деле их следует разбить на 2 отдельных запроса . Какова общая цель наличия COUNT в запросе? Это должно быть сделано по-другому.

0 голосов
/ 07 февраля 2011

Вы просите оператор SELECT вернуть только COUNT(*) AS count. Если вы хотите получить больше столбцов, вы должны указать их в операторе SELECT.

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