MySQL替代子查询/加入

时间:2016-07-08 06:15:33

标签: mysql sql subquery

我正在寻找这个查询的子查询/连接的有效替代方案。假设我是一个存储有以下列公司信息的表:

  • name:公司名称
  • 州:公司所在的州 在
  • 收入:公司的年收入
  • 员工:多少人 这家公司的员工有
  • 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)?

1 个答案:

答案 0 :(得分: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”时,您会发现这一点。