我正在开发一个包含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中实现寻呼机,我需要知道当天有多少公司提供该产品。 LIMIT意味着我只看到前几个......
我尝试将SELECT子句更改为SELECT COUNT(a.id)或SELECT COUNT(DISTINCT(a.id)),但这些似乎都没有给我我想要的东西。我尝试在计数查询中删除GROUP BY和ORDER BY,但这也不起作用。有什么想法吗?
答案 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不会在任何地方保存行数。