Я перечитал вопрос, и мне непонятно, какие запросы возвращают то, что.
Что мы ожидаем:
первый запрос: ни одна строка не возвращается (только 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
устраняет повторяющиеся строки.
Вы получаете 250 строк, если вы удалите 'LIMIT' вообще? – Travesty3
@ Travesty3 - Да, я получаю все 250 строк. – Xaisoft
Можете ли вы воспроизвести проблему в [SQL Fiddle] (http://sqlfiddle.com/)? – Travesty3