2016-07-08 105 views
2

我正在尋找一種有效的替代子查詢/連接的查詢。比方說,我存儲有關的公司有以下的列信息的表:MySQL替代子查詢/加入

  • 名稱:公司名稱
  • 狀態:狀態公司位於 在
  • 收入:年收入公司
  • 員工:這家公司有多少員工 有
  • active_business:羯羊或不是公司 是商業(1 =是,0 =否)

假設從這個表格中,我想知道每個州有多少家公司滿足最低收入要求的條件,以及有多少家公司滿足最低僱員人數要求。這可以表示爲以下子查詢(也可以寫成一個連接):

SELECT state, 
     (
      SELECT count(*) 
      FROM records AS a 
      WHERE a.state = records.state 
       AND a.revenue > 1000000 
     ) AS companies_with_min_revenue, 
     (
      SELECT count(*) 
      FROM records AS a 
      WHERE a.state = records.state 
       AND a.employees > 10 
     ) AS companies_with_min_employees 
FROM records 
WHERE active_business = 1 
GROUP BY state 

我的問題是這樣的。我可以在沒有子查詢或連接的情況下執行此操作嗎?由於查詢已經遍歷每一行(沒有索引),是否有一些方法可以添加條件:如果行符合最低收入要求並處於相同狀態,則會爲查詢增加某種計數器(類似於map/reduce)?

+3

沒有索引?那麼,那就是你的問題了。解決了。 – Strawberry

+0

通常,這種情況將被編入索引。但是,這實際上並沒有在mysql上運行。我在Memsql中使用JSON數據存儲和用戶提交的動態字段,因此特定值的索引不是正確的路徑。而且,由於memsql在內存中,它已經運行得非常快,所以不需要索引。我以這樣的方式提交了這個問題,因爲它在邏輯上等同於問題的簡單方式。 – user396404

回答

3

我覺得CASESUM將解決這個問題:

SELECT state 
    , SUM(CASE WHEN R.revenue > 1000000 THEN 1 ELSE 0 END) AS companies_with_min_revenue 
    , SUM(CASE WHEN R.employees > 10 THEN 1 ELSE 0 END) AS companies_with_min_employees 
    FROM records R 
    WHERE R.active_business = 1 
    GROUP BY R.state 

正如你所看到的,我們將有1每條記錄​​的值與大於1000000(否則爲0)收入,那麼我們將拿總和。另一列也一樣。

感謝這個StackOverflow的問題。當你在谷歌搜索「sql conditional count」時,你會發現這個。

+0

正是我在找的東西。謝謝! – user396404

+0

沒問題@ user396404 – KaeL