【发布时间】:2012-07-01 04:31:47
【问题描述】:
出于分页原因,我正在对我的数据库运行两个查询。因此,每个查询几乎是相同的。我的 COUNT(*) 查询没有返回非计数查询的结果数。我很困惑为什么会这样。查询如下。
SELECT p.host_id, p.rating_support, p.rating_tech, MAX(p.rating_overall) AS rating_overall, p.publish_rating, h.name, prices.price, prices.term_duration
FROM plans p
INNER JOIN hosts AS h ON h.id = p.host_id
INNER JOIN (SELECT plan_id, price, term_duration FROM prices WHERE price > 0 AND price < 50 AND term_duration = 1) prices ON prices.plan_id = p.id
WHERE p.published = 1 AND h.published = 1
GROUP BY p.host_id
ORDER BY rating_overall desc LIMIT 0, 12
SELECT COUNT(*) AS count
FROM plans p
INNER JOIN hosts AS h ON h.id = p.host_id
INNER JOIN (SELECT plan_id, price, term_duration FROM prices WHERE price > 0 AND price < 50 AND term_duration = 1) prices ON prices.plan_id = p.id
WHERE p.published = 1 AND h.published = 1
GROUP BY p.host_id
我不是 MySQL 专家。除了计数没有提供正确数量的结果之外,非计数查询也能完美运行。
任何关于这个问题的观点都会很棒。
【问题讨论】:
-
我看到你的第一个查询有限制,但第二个没有。这可能会限制您想要考虑的结果。
-
您好@Andrew,是的,由于分页原因,第一个查询必须限制结果。例如,第一页将显示多达 12 个结果。第二页将显示另外 12 个结果,使用限制进行偏移。第二个查询不应该受到限制,因为我们需要知道结果的全部数量来确定我们将拥有多少页。我的问题是,第一个查询返回 6 个结果,第二个查询 COUNT(*) 返回 3。这怎么会发生?
-
我怀疑是 MAX 不在计数查询中。这将消除计数没有的记录。
-
@AdrianCornish - 这一点都不奇怪。
SELECT COUNT(*) FROM table GROUP BY x将为每个不同的 x 值返回一行,并报告为每个不同的 x 值聚合了多少行数据。就像SELECT x, COUNT(*) FROM table GROUP BY x。因此,如果第一个查询给出 6 行,则第二个查询也应该给出 6 行,结果是每个 p.host_id 的不同值聚合了多少行数据。 -
@Akaishen - 您的
COUNT(*)查询有GROUP BY p.host_id。这意味着return one row per distinct value of p.host id。这就是 both 查询返回 6 行的原因。此外,COUNT(*)告诉您(通过 GROUP BY) 聚合了多少行以形成该一个输出行。COUNT(distinct p.host_id)而是告诉您在该输出行中存在多少 p.host_id 的不同值。所以,要么使用COUNT(distinct p.host_id)和删除GROUP BY,或者按照@biziclop的建议去做。使用嵌套查询计算结果中的行数,而不是计算输入中的行数