2

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

  1. 公司名单
  2. 他们销售的产品表
  3. 他们在每个日期提供的价格表

我正在我的 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 中实现寻呼机,我需要知道当天提供该产品的公司总数。限制意味着我只看到前几个......

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

4

2 回答 2

3

在我看来,你应该这样做GROUP BY a.id, c.id——分组a.id只意味着你通常会有几个c.ids per a.id,而你只是得到一个“随机”的其中一个。这似乎是一个基本正确性的问题。一旦你解决了这个问题,一个初始的SELECT COUNT(*) FROMetc 等应该肯定会为你提供以下查询将返回的行数,这样你就可以相应地准备你的寻呼机。

于 2009-05-10T20:37:20.843 回答
3

这个网站建议 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 不会在任何地方保存行数。

于 2009-05-10T20:47:00.623 回答