Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算两个表的平均值时的嵌套选择_Mysql_Sql - Fatal编程技术网

Mysql 计算两个表的平均值时的嵌套选择

Mysql 计算两个表的平均值时的嵌套选择,mysql,sql,Mysql,Sql,我有两张桌子: Wokers-持有员工id、雇佣公司、合同类型,比如a或b +----+------------+----------+ | id | company_id | contract | +----+------------+----------+ | 1 | 1 | a | | 2 | 1 | b | | 3 | 3 | b | | 4 | 2 | a

我有两张桌子:

Wokers-持有员工id、雇佣公司、合同类型,比如a或b

+----+------------+----------+
| id | company_id | contract |
+----+------------+----------+
|  1 |          1 | a        |
|  2 |          1 | b        |
|  3 |          3 | b        |
|  4 |          2 | a        |
+----+------------+----------+
公司-持有公司id和公司名称

+----+--------------+
| id | company_name |
+----+--------------+
|  1 | Company 1    |
|  2 | Company 2    |
|  3 | Company 3    |
|  4 | Company 4    |
+----+--------------+
我想做的是选择每家公司中两种合同的平均雇员人数。 以下是我写的:

SELECT
  (SELECT COUNT(*)
   FROM Workers
   WHERE `contract` = 'a') / (SELECT COUNT(*)
                                FROM Companies) 'Contract A',
  (SELECT COUNT(*)
   FROM Workers
   WHERE `contract` = 'b') / (SELECT COUNT(*)
                               FROM Companies)  'Contract B';
而且:

SELECT
  sum(case when `contract` = 'a'
    then 1
      else 0 end) / (SELECT COUNT(*)
                     FROM Companies) 'Contract A',
  sum(case when `rodzaj contract` = 'uop'
    then 1
      else 0 end) / (SELECT COUNT(*)
                     FROM Companies) 'Contract B'
FROM Workers;
哪一个更有效?有没有更简单的方法?我正在使用MySQL


预期产出将是合同A-0,5,合同B-0,5,因为在4家公司中有2人在合同A上,在这4家公司中有2人在合同B上

我会选择:

SELECT SUM(contract = 'a') / c.cnt as contract_a,
       SUM(contract = 'b') / c.cnt as contract_b
FROM Workers w CROSS JOIN
     (SELECT COUNT(*) as cnt FROM Companies) c;
或者,如果可以在单独的行上处理结果:

select contract, count(*) / cnt
from Workers w cross join
     (select count(*) as cnt from Companies) c
group by contract, cnt;
至于性能,将count*查询放在FROM子句中可以保证它只被计算一次。因此,这似乎是一种性能提升

此外,字符串和日期常量只能使用单引号。尝试使用不需要转义的列别名。

我会选择:

SELECT SUM(contract = 'a') / c.cnt as contract_a,
       SUM(contract = 'b') / c.cnt as contract_b
FROM Workers w CROSS JOIN
     (SELECT COUNT(*) as cnt FROM Companies) c;
或者,如果可以在单独的行上处理结果:

select contract, count(*) / cnt
from Workers w cross join
     (select count(*) as cnt from Companies) c
group by contract, cnt;
至于性能,将count*查询放在FROM子句中可以保证它只被计算一次。因此,这似乎是一种性能提升


此外,字符串和日期常量只能使用单引号。尝试使用不需要转义的列别名。

平均员工人数是什么意思?也许你可以加入预期输出来澄清你的问题?预期输出将是合同A-0,5,合同B-0,5,因为4家公司的合同A上有2个人,而这4家公司的合同B上有2个人。请把这一点添加到您的问题中。哪一个更有效?索引和使用的表引擎是什么?显示一些show CREATE TABLE语句mysql。我把它添加到问题中。员工的平均数量是什么意思?也许你可以加入预期输出来澄清你的问题?预期输出将是合同A-0,5,合同B-0,5,因为4家公司的合同A上有2个人,而这4家公司的合同B上有2个人。请把这一点添加到您的问题中。哪一个更有效?索引和使用的表引擎是什么?显示一些show CREATE TABLE语句mysql。我把它添加到问题中。选择合同,计数/按合同从工人组中选择公司的平均数;工作也很顺利。为什么?@steve1337。为什么?它也是合法的语法。我猜MySQL会为结果集中的每一行计算子查询一次,但它可能有一个只运行一次的优化;工作也很顺利。为什么?@steve1337。为什么?它也是合法的语法。我猜MySQL将对结果集中的每一行计算子查询一次,但它可能有一个只运行一次的优化。