【问题标题】:MySQL alternative to subquery/joinMySQL 替代子查询/连接
【发布时间】:2016-11-10 15:10:02
【问题描述】:

我正在为此查询寻找子查询/联接的有效替代方法。假设我有一个表,其中存储有关公司的信息,其中包含以下列:

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

【问题讨论】:

  • 没有索引?好吧,那就是你的问题。解决了。​​
  • 通常情况下,这种情况会被编入索引。但是,这实际上并没有在 mysql 上运行。我在 Memsql 中使用 JSON 数据存储和用户提交的动态字段,因此特定值的索引不是正确的路径。此外,由于 memsql 在内存中,它已经运行得非常快,因此不需要索引。我提交了这样的问题,因为它在逻辑上以更简单的方式等同于问题。

标签: mysql sql subquery


【解决方案1】:

我认为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

如您所见,每条收入大于1000000(否则为0)的记录的值为1,然后我们将取总和。另一列也是如此。

感谢StackOverflow 这个问题。当您在 google 中搜索 “sql 条件计数” 时,您会发现它。

【讨论】:

  • 正是我想要的。谢谢!
  • 没问题@user396404
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2011-11-25
  • 2010-11-06
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多