2013-02-18 107 views
3

親愛的朋友們,我有一個要求從一張表中獲得具有不同標準的計數(*)。我在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"; 

但它花費了相當多的時間。你能告訴我有什麼辦法可以用最少的時間和一個選擇條款來做到嗎?

在此先感謝。

+0

有多少行,你必須在該表? – 2013-02-18 08:53:23

回答

1

使用group by

喜歡的東西:

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

使用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 

只是改變滿足您的需求值。

+0

謝謝JW。但它所花費的時間與以前相同。 – 2013-02-18 08:44:07

+0

嘗試在* status *和* business_id *上添加'INDEX',例如'ALTER TABLE inquiry ADD INDEX(business_id,status)',並再次執行查詢。 – 2013-02-18 08:46:12

+0

除了添加索引之外,還應該寫count(1)來代替count(*)。這裏1是主鍵的列索引。 – 2013-02-18 09:31:25