0

很长一段时间以来,我都无法弄清楚为什么COUNT(*)返回了不正确的值。在逐步删除部分查询后,我终于意识到连接表是错误值背后的原因。

这是我正在使用的查询:

SELECT `profiles`.`logo` AS logo,
       `companies`.`company_name`,
       `companies`.`url_slug`,
       count(*)
FROM (`companies`)

JOIN `users` ON `users`.`id` = `companies`.`user_id`
JOIN `categories` ON `categories`.`company_id` = `companies`.`id`
JOIN `products` ON `products`.`company_id` = `companies`.`id`
JOIN `profiles` ON `profiles`.`company_id` = `companies`.`id`

WHERE `users`.`last_login` IS NOT NULL
  AND `categories`.`category_id` = '3'
  AND `products`.`active` = 1
  AND `products`.`xmp_1` = 1
  AND `products`.`xmp_2` = 1
  AND `profiles`.`field_a` = 1
GROUP BY `companies`.`id`

在我的 SQL 程序中运行它会返回 28 行,但该COUNT(*)行会返回 1400 之类的东西。我不知道从哪里开始。我需要返回一个返回 28 而不是 1400 的列。

SQL Fiddle 示例数据:http ://sqlfiddle.com/#!2/97d2d/9

4

2 回答 2

2

没有办法通过简单的查询来做到这一点。Chris Hayes 展示了一种使用子查询的方法,并且有多种方法可以做到这一点。

原因是聚合函数(如COUNT)仅适用于GROUP一行代表的...在这种情况下,每一行代表具有相同公司 ID 的结果集。在一个简单的查询中,行中的字段无法显示超出其内容的聚合信息。

使用子查询,您可以生成第一个表,然后对其进行聚合。或者,您可以只使用返回的总行数作为元数据包含在数据中的事实,该数据被发送回首先提交查询的任何客户端,从而无需将其包含在数据中。

于 2013-08-06T23:03:30.863 回答
1

以下查询有效:

SELECT *, COUNT(*) FROM (
SELECT `profiles`.`logo` AS logo,
       `companies`.`company_name`,
       `companies`.`url_slug`
FROM (`companies`)

JOIN `users` ON `users`.`id` = `companies`.`user_id`
JOIN `categories` ON `categories`.`company_id` = `companies`.`id`
JOIN `products` ON `products`.`company_id` = `companies`.`id`
JOIN `profiles` ON `profiles`.`company_id` = `companies`.`id`

WHERE `users`.`last_login` IS NOT NULL
  #AND `categories`.`category_id` = '3'
  AND `products`.`active` = 1
  #AND `products`.`xmp_1` = 1
  #AND `products`.`xmp_2` = 1
  AND `profiles`.`field_a` = 1
GROUP BY `companies`.`id`
) AS stuff

我认为您的原件不知何故COUNT(*)正在查看预加入条件或预分组金额。

于 2013-08-06T23:42:01.843 回答