具有多个JOINS和GROUP BY CLAUSE的查询中的COUNT

时间:2009-05-10 20:28:46

标签: sql mysql join count

我正在开发一个包含3个表的数据库:

  1. 公司列表
  2. 他们销售的产品表
  3. 他们在每个日期提供的价格表
  4. 我正在我的php中进行这样的查询,以生成在特定日期对某种产品类型提供最低价格的公司列表。

    SELECT
      a.name AS company,
      c.id,
      MIN(c.price) AS apy
    FROM `companies` a
    JOIN `company_products` b ON b.company_id = a.id
    JOIN `product_prices` c ON c.product_id = b.id
    WHERE
      b.type = "%s"
      AND c.date = "%s"
    GROUP BY a.id
    ORDER BY c.price ASC
    LIMIT %d, %d
    

    这可以获得我需要的数据,但为了在PHP中实现寻呼机,我需要知道当天有多少公司提供该产品。 LIMIT意味着我只看到前几个......

    我尝试将SELECT子句更改为SELECT COUNT(a.id)或SELECT COUNT(DISTINCT(a.id)),但这些似乎都没有给我我想要的东西。我尝试在计数查询中删除GROUP BY和ORDER BY,但这也不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我觉得你应该GROUP BY a.id, c.id - 按a.id进行分组只意味着每c.id通常会有几个a.id,而你只是得到了其中一个是“随机的”。这似乎是一个基本正确性的问题。一旦你修复了它,一个初始的SELECT COUNT(*) FROM等应该肯定会给你以下查询将返回的行数,所以你可以相应地准备你的寻呼机。

答案 1 :(得分:3)

This website建议MySQL有一个特殊的技巧,至少从版本4开始:

幸运的是,自MySQL 4.0.0起,您可以在查询中使用SQL_CALC_FOUND_ROWS选项,这将告诉MySQL计算忽略LIMIT子句的总行数。您仍然需要执行第二个查询才能检索行数,但这是一个简单的查询,并不像检索数据的查询那么复杂。

用法非常简单。在主查询中,您需要在SELECT之后添加SQL_CALC_FOUND_ROWS选项,在第二个查询中,您需要使用FOUND_ROWS()函数来获取总行数。查询看起来像这样:

SELECT SQL_CALC_FOUND_ROWS name, email 
FROM users 
WHERE name LIKE 'a%' 
LIMIT 10;

SELECT FOUND_ROWS();

唯一的限制是必须在第一个查询之后立即调用第二个查询,因为SQL_CALC_FOUND_ROWS不会在任何地方保存行数。