2013-08-05 2 views
0

Когда я запускаю следующие запросы с SQL_CALC_FOUND_ROWS или задаю все цвета RED,BLUE,YELLOW в подзапросе с использованием предложения IN, я получаю количество записей 198. Но когда я делаю каждый цвет индивидуально, я получаю COUNT, который добавляет до 248 (72 + 59 + 118). Откуда берутся дополнительные 50 строк? Я бы подумал, что если бы я сделал их индивидуально, а затем добавил их, я получил бы 198, но я получаю 248. Я рассматриваю, как предложение IN работает неправильно? Я предпочел бы использовать COUNT вместо SQL_CALC_FOUND_ROWS, потому что я нашел SQL_CALC_FOUND_ROWS гораздо медленнее (+3 секунды)В чем причина того, что подсчеты отличаются в запросах mysql?

Вот несколько статистика:

1. I am running MySQL Version: 5.5.2 
2. The tables engine is INNODB. 
3. All the `CHECK TABLE .... EXTENDED` return OK. 

-- Returns 198 
SELECT SQL_CALC_FOUND_ROWS DISTINCT p.* FROM Persons AS p 
INNER JOIN Colors AS c ON c.PersonId = p.Id 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('YELLOW','RED','BLUE'); 
SELECT FOUND_ROWS(); 

-- Returns 198 
SELECT COUNT(1) as MyCount FROM (SELECT DISTINCT p.* FROM Persons AS p 
INNER JOIN Colors AS c ON c.PersonId = p.Id 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('YELLOW','RED','BLUE')) all; 

-- Returns 72 
SELECT COUNT(1) as MyCount FROM (SELECT DISTINCT p.* FROM Persons AS p 
INNER JOIN Colors AS c ON c.PersonId = p.Id 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('RED')) red; 

-- Returns 59 
SELECT COUNT(1) as MyCount FROM (SELECT DISTINCT p.* FROM Persons AS p 
INNER JOIN Colors AS c ON c.PersonId = p.Id 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('BLUE')) blue; 

-- Returns 118 
SELECT COUNT(1) as MyCount FROM (SELECT DISTINCT p.* FROM Persons AS p 
INNER JOIN Colors AS c ON c.PersonId = p.Id 
WHERE p.Name = 'John Doe' AND c.ColorName IN ('YELLOW')) yellow; 
+0

http://stackoverflow.com/questions/18025315/no-mysql-records-return-when-past-a-certain-limit –

+0

@MitchWheat - Да, это было приостановлено, и это имеет больше смысла и более понятно. – Xaisoft

ответ

1

Нечто подобное происходит:

Persons таблица

ID Name 
-- ------------ 
1 John Doe 
2 Xaisoft 

Colors стол

PersonID ColorName 
-------- --------- 
     1 Red 
     1 Yellow 
     2 Yellow 

Теперь запрос Persons.* для John Doe во время присоединения к Colors:

SELECT p.* 
FROM Persons p 
INNER JOIN Colors C ON c.PersonID = p.ID 
WHERE p.Name = 'John Doe'; 

Ваш результат будет один p.* ряд для каждого цвета под John Doe:

ID Name 
-- ------------ 
1 John Doe 
1 John Doe 

Если применить COUNT DISTINCT против этого вы получите 1.

Если вы считаете Red и Yellow отдельно, вы получите по одному для каждого запроса. Добавьте их, и вы получите 2.


Посмотрите на это следующим образом: если вы выкидывать COUNT и просто SELECT DISTINCT Persons.* вы получите эти результаты:

красный или желтый цвет для John Doe:

SELECT DISTINCT p.* 
FROM Persons p 
INNER JOIN Colors C ON c.PersonID = p.ID 
WHERE p.Name = 'John Doe' 
    AND c.ColorName IN ('RED', 'YELLOW'); 

ID Name 
-- ---------- 
1 John Doe 

Красный только для John Doe:

SELECT DISTINCT p.* 
FROM Persons p 
INNER JOIN Colors C ON c.PersonID = p.ID 
WHERE p.Name = 'John Doe' 
    AND c.ColorName IN ('RED'); 

ID Name 
-- ---------- 
1 John Doe 

желтый только для John Doe:

SELECT DISTINCT p.* 
FROM Persons p 
INNER JOIN Colors C ON c.PersonID = p.ID 
WHERE p.Name = 'John Doe' 
    AND c.ColorName IN ('YELLOW'); 

ID Name 
-- ---------- 
1 John Doe 
+0

Но я применяю DISTINCT COUNT к отдельным. – Xaisoft

+0

Но ваш отчетный счет основан только на таблице «Лица», а не на человеке и цветах. Я добавил пример моего ответа; взглянуть.Если это не имеет смысла, попробуйте запустить второй-пятый запрос выше, начиная с 'SELECT * FROM' вместо' SELECT COUNT (1) в качестве MyCount FROM'. Вы получите повторные имена по запросам 3, 4 и 5. Эти имена * не * повторяются для запроса 2 из-за 'DISTINCT'. –

+0

Я изменил свой запрос здесь, чтобы увидеть, что на самом деле возвращается из внутренней таблицы, и я заметил повторяющиеся или неявные значения, которые объясняли бы дополнительные строки. Спасибо, что указал мне в правильном направлении. Честно говоря, я до сих пор не совсем понимаю это на 100%, но я на полпути туда :) – Xaisoft

Смежные вопросы