【问题标题】:Select count(*) from many tables从许多表中选择 count(*)
【发布时间】:2013-02-02 15:21:35
【问题描述】:

亲爱的朋友们,我需要从具有不同标准的一张表中获取计数(*)。我正在使用带有 spring 的 hibernate。我正在使用下面的查询。

"select  " +
            "(select count(*)  from enquiry  where business_id="+busid+")  AS allEnqCount,"+
    "(select count(*)  from enquiry where status='"+Constants.ENQ_FALLOWUP+"' and us.business_id="+busid+")  AS followupCount," +
    "(select count(*)  from enquiry where status='"+Constants.ENQ_SITE_VISIT+"'and us.business_id="+busid+")  AS siteVisitCount ," +
    "(select count(*)  from enquiry where status='"+Constants.ENQ_CUST_VISIT+"'and us.business_id="+busid+")  AS customerVisitCount," +
    "(select count(*)  from enquiry where status='"+Constants.ENQ_OFFICE_VISIT+"'and us.business_id="+busid+")  AS officevisitCount,"+
    "(select count(*)  from enquiry where status='"+Constants.ENQ_PENDING+"'and us.business_id="+busid+")  AS pending";

但这需要相当长的时间。你能告诉我有没有什么方法可以用最少的时间和一个选择子句来完成。

提前致谢。

【问题讨论】:

  • 那张表有多少行?

标签: java mysql sql hibernate


【解决方案1】:

使用CASE

SELECT  SUM(CASE WHEN business_id = 'busid' THEN 1 END) allEnqCount,
        SUM(CASE WHEN status = 'ENQ_FALLOWUP' AND us.business_id = 'busid' THEN 1 END) followupCount,
        SUM(CASE WHEN status = 'ENQ_SITE_VISIT' AND us.business_id = 'busid' THEN 1 END) siteVisitCount,
        SUM(CASE WHEN status = 'ENQ_CUST_VISIT' AND us.business_id = 'busid' THEN 1 END) customerVisitCount,
        SUM(CASE WHEN status = 'ENQ_OFFICE_VISIT' AND us.business_id = 'busid' THEN 1 END) officevisitCount,
        SUM(CASE WHEN status = 'ENQ_PENDING' AND us.business_id = 'busid' THEN 1 END) pending
FROM    enquiry

只需更改满足您需求的值。

【讨论】:

  • 谢谢 JW。但它所花费的时间与以前相同。
  • 尝试在 statusbusiness_id 上添加INDEX,例如ALTER TABLE enquiry ADD INDEX (business_id, status),然后再次执行查询。
  • 除了添加 index 之外,您还应该写 count(1) 代替 count(*) 。这里 1 是主键列的索引。
  • @Andreas :谢谢伙计,我肯定会尽我所能澄清这个问题,但在那之前我会接受你的概念
【解决方案2】:

使用group by:

类似:

select 
      status,
      count(*) 
from enquiry 
where business_id = @busid 
group by status

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2011-10-06
    • 1970-01-01
    • 2021-09-03
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多