【问题标题】:Get count of complex query获取复杂查询的计数
【发布时间】:2012-04-21 01:08:04
【问题描述】:

我想统计以下查询返回的总行数:

SELECT table1.*, COUNT(table2.fk) * (100/18) AS 'number' 
FROM table1 INNER JOIN table2 ON table1.pk = table2.fk
WHERE table1.Street LIKE '$Street%' 
AND table1.City LIKE '$City%' 
AND table1.Zip LIKE '%$Zip' 
AND table1.DOBY LIKE '%$DOBY' 
AND table1.DOBM LIKE '%$DOBM' 
AND table1.DOBD LIKE '%$DOBD' 
AND table1.Gender LIKE '$gender%' 
AND table2.year>= 2004 
AND table2.type IN ('AA', 'AB', 'AC') 
GROUP BY table2.fk
HAVING (COUNT(table2.fk) * (100/18)) >= '$activity' 
ORDER BY DOBY, DOBM, DOBD ASC

查询将table1的主键作为table2的外键出现的次数或次数,并根据固定的数量计算百分比('number')。它工作得很好,但我无法获得为我的分页脚本找到的记录总数。 如果有人能提供一些建议或解决方案,我将不胜感激。

【问题讨论】:

  • 会做一个子查询工作(即(SELECT COUNT(id) FROM table WHERE conditional = $variable) AS count)吗?或者这个查询是你需要计数的吗?我没有看到 LIMIT 关键字。
  • 这是我需要计数的查询。它要复杂得多,但为了简单起见,我对其进行了一些编辑。 limit 关键字出现在最后一行“LIMIT $start, $limit;”之后

标签: mysql select join count having


【解决方案1】:

正如 Itay Moav 所说,一种编程语言应该具有found_rows 函数的函数。根据function documentation,如果LIMIT 关键字不存在,它将返回带有LIMIT 关键字的SELECT 语句的行数。

如果没有,您可以对数据库进行另一个SELECT 查询:SELECT FOUND_ROWS();。它将返回相同的信息。

【讨论】:

    【解决方案2】:

    你可以做SQL_CALC_FOUND_ROWS(谷歌的确切语法)
    然后使用SELECT FOUND_ROWS() AS total

    【讨论】:

    • 非常感谢!在我使用的非常大的数据库上它有点慢,但它现在必须工作。
    • 如果它很大,你应该缓存计数。没有人在他们的分页中给出非常大的数字的确切数字(不是事件谷歌)。还有一件事,你只在第一次使用这个,你一定要把它缓存一小段时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多