Записи MySQL не возвращаются после превышения определенного лимита?

У меня есть следующий запрос, который возвращает 250 записей:

SELECT DISTINCT p.* FROM Persons AS p
                      INNER JOIN Colors AS c ON c.ColorId = p.FavoriteColorId 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('RED','BLUE','YELLOW')
                      LIMIT 240,10;

-- Returns 198 records
SELECT DISTINCT p.* FROM Persons AS p
                      INNER JOIN Colors AS c ON c.ColorId = p.FavoriteColorId 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('RED','BLUE','YELLOW')

-- Returns 250 records. Why?
SELECT DISTINCT COUNT(*) FROM Persons AS p
                      INNER JOIN Colors AS c ON c.ColorId = p.FavoriteColorId 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('RED','BLUE','YELLOW')

Когда я выполняю вышеописанное, я не вижу записей, хотя их всего 250. Это только начинает возвращать записи, когда я изменяю LIMIT в LIMIT 197,10Затем я вижу 1 из записей.

Почему это происходит?

3 ответа

Вы отличились в неправильном месте для подсчета. Вы подсчитываете все строки (250) и выбираете различные значения строк. Есть только 1 ряд, который равен 250.

То, что вы имели в виду, было выбрано count(отличный p.*), Который затем вернет 198

Я перечитал вопрос, и мне не ясно, какие запросы что возвращают.

Что мы ожидаем:

  • первый запрос: строки не возвращаются (только 198 различных строк, не пропускается 240 строк)

  • второй запрос: возвращено 198 строк, звучит разумно

  • третий запрос: возвращает 1 строку со значением 250, что опять-таки является разумным.

Если это поведение, которое вы видите, то это все, что можно ожидать.

Оператор DISTINCT удаляет дубликаты строк, что объясняет разницу между 198 и 250. И поскольку LIMIT применяется как последний шаг (или почти последний шаг) в плане выполнения, это объясняет, почему в первом запросе строки не возвращаются.

Чтобы получить счетчик 198 строк, возвращаемых вторым запросом, один простой способ получить это заключался бы в том, чтобы обернуть этот второй запрос (который возвращает 198 строк) в другой запрос, который получает COUNT из этого.

SELECT COUNT(1) AS mycount
  FROM (
         SELECT DISTINCT p.*
           FROM Persons p
           JOIN Colors c
             ON c.ColorId = p.FavoriteColorId
            AND c.ColorName IN ('RED','BLUE','YELLOW')
          WHERE p.Name = 'John Doe'
       ) q

Если вы хотите, чтобы количество строк из Persons таблицу, не удаляя дубликаты из таблицы Persons, тогда один из способов получить это будет:

SELECT COUNT(1) AS mycount
  FROM Persons p
 WHERE p.Name = 'John Doe'
   AND EXISTS ( SELECT 1 
                  FROM Colors c
                 WHERE c.ColorName IN ('RED','BLUE','YELLOW')
                   AND c.ColorId = p.FavoriteColorId
              )

Если у вас есть один столбец, который является УНИКАЛЬНЫМ и НЕ ПУСТО (NULL) в таблице Persons, например, id INT PRIMARY KEYВы могли бы сделать это:

SELECT COUNT(DISTINCT p.id) AS mycount
  FROM Persons p
  JOIN Colors c 
    ON c.ColorName IN ('RED','BLUE','YELLOW')
   AND c.ColorId = p.FavoriteColorId
 WHERE p.Name = 'John Doe'

ОРИГИНАЛЬНЫЙ ОТВЕТ

Этот первый запрос должен возвращать не более 10 строк.

Вы сообщаете, что второй запрос возвращает 198 строк. Я не вижу, как этот первый запрос (идентичный этому, за исключением добавления предложения LIMIT) должен возвращать любые строки, если это правда.

Третий запрос должен возвращать одну строку.

Там нет хорошего объяснения результатов, которые вы видите.

Q Можете ли вы повторить это поведение в клиенте командной строки msyql, просто чтобы исключить поведение в клиентском приложении, которое вы используете.

Q Какую версию MySQL вы используете? (Это может быть ошибка в вашей версии MySQL.)

В Какой движок используют эти таблицы (MyISAM, InnoDB)?

Q Вы убедились, что ваши таблицы соответствуют CHECK TABLE tablename EXTENDED?

Q И вы убедились, что какой-то другой процесс не вставляет, не обновляет и / или не удаляет строки во время выполнения ваших запросов?

Ваш первый запрос немного странный, потому что он определяет LIMIT оговорка, но нет GROUP BY или же ORDER BY или что-то еще, что предписывает, в каком порядке должны быть возвращены строки.

Третий запрос немного странный в том, что DISTINCT Ключевое слово не нужно. Отсутствует GROUP BY оговорка, мы ожидаем SELECT COUNT(*) вернуть одну строку.

Часть меня спрашивает, является ли сообщение о наблюдаемом поведении точным. Этот третий запрос действительно возвращает 250 строк, или он возвращает одну строку со значением 250 для счетчика? (Это две очень разные вещи.)

Мы обычно ожидаем SELECT COUNT(*) вернуть значение больше, чем количество строк, возвращаемых SELECT DISTINCT p.* в случаях, когда DISTINCT Оператор устраняет дубликаты строк.

По умолчанию заказ ASC

попробуйте изменить порядок и получить только 10 таких записей

     Order by RAND ()  LIMIT 10

Без ORDER BY порядок сортировки по умолчанию отсутствует. так что если вы не указали порядок, то он случайный, тогда вы можете просто ограничить 10 записей без установки позиции 240.

РЕДАКТИРОВАТЬ:

 SELECT  COUNT(*) as counts FROM Persons AS p
                  INNER JOIN Colors AS c ON c.ColorId = p.FavoriteColorId 
 WHERE p.Name = 'John Doe' AND c.ColorName IN ('RED','BLUE','YELLOW')
 GROUP BY c.Id ORDER BY c.Id LIMIT 240,10
Другие вопросы по тегам