2013-08-02 1 views
-2

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

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 из записей.

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

+1

Вы получаете 250 строк, если вы удалите 'LIMIT' вообще? – Travesty3

+0

@ Travesty3 - Да, я получаю все 250 строк. – Xaisoft

+0

Можете ли вы воспроизвести проблему в [SQL Fiddle] (http://sqlfiddle.com/)? – Travesty3

ответ

0

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

попытка отменить заказ и получить только 10 записей, как этот

 Order by RAND() LIMIT 10 

Without ORDER BY, there is no default sort order. так что если вы не указан порядок, то его случайное, то вы можете просто предел 10 записей без установки положения 240.

EDIT:

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 
+0

Закажите, что, хотя, какой-то случайный столбец? – Xaisoft

+0

@ Xaisoft вы сказали, что он исправлен? –

+0

нет, я имею в виду, что предложение IN исправлено, я имел 'c.FavoriteColorId IN ...', я хочу поставить 'c.ColorName IN ...' Однако, когда я снова запустил его в браузере запросов с LIMI 240 , 10, он вернул записи на этот раз, и я ничего не изменил. Есть ли внутренний порядок? – Xaisoft

0

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

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

  • первый запрос: ни одна строка не возвращается (только 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 таблицы, без устранения дубликатов из таблицы Лица, затем один способ получить что бы:

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 
      ) 

Если у вас есть один столбец то есть UNIQUE и NOT NULL в таблице Лица, к примеру, 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.)

Q Какой движок эти таблицы используют (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 устраняет повторяющиеся строки.

+0

просто мало выйди, если посмеешь :) –

1

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

Что вы имели в виду было выберите кол (отчетливый р. *), Которая будет затем вернуть 198