【发布时间】:2013-08-05 14:17:56
【问题描述】:
当我使用SQL_CALC_FOUND_ROWS 运行以下查询或使用IN 子句在子查询中指定所有颜色RED,BLUE,YELLOW 时,我得到198 的记录计数。但是当我单独做每种颜色时,我得到一个COUNT,加起来就是248 (72 + 59 + 118)。额外的 50 行从何而来?我原以为如果我单独完成它们然后将它们相加,我会得到198,但我得到的是248。我是否正在查看 IN 子句如何不正确地工作?我更喜欢使用COUNT 而不是SQL_CALC_FOUND_ROWS,因为我发现SQL_CALC_FOUND_ROWS 要慢得多(+3 秒)
以下是一些统计数据:
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;
【问题讨论】:
-
@MitchWheat - 是的,它被搁置了,这更有意义,更清晰。