首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个联接和GROUP子句的查询中的计数

问具有多个联接和GROUP子句的查询中的计数
EN

Stack Overflow用户
提问于 2009-05-10 20:28:46
回答 2查看 5.7K关注 0票数 2

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

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

我正在我的php中执行这样的查询,以生成在某一特定日期提供某一特定产品类型的最低价格的公司列表。

代码语言:javascript
复制
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 (DISTINCT(a.id)),但这两个选项似乎都不能满足我的需要。我尝试在计数查询中删除组BY和ORDER,但这也不起作用。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-10 20:37:20

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

票数 3
EN

Stack Overflow用户

发布于 2009-05-10 20:47:00

本网站建议MySQL在这方面有一个特殊的诀窍,至少在第4版时是这样的:

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

用法很简单。在主查询中,您需要在SELECT之后添加SQL_CALC_FOUND_ROWS选项,而在第二个查询中,您需要使用FOUND_ROWS()函数来获得总行数。查询将如下所示:

代码语言:javascript
复制
SELECT SQL_CALC_FOUND_ROWS name, email 
FROM users 
WHERE name LIKE 'a%' 
LIMIT 10;

SELECT FOUND_ROWS();

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/846047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档