Mysql 计算两个表的平均值时的嵌套选择
我有两张桌子: Wokers-持有员工id、雇佣公司、合同类型,比如a或bMysql 计算两个表的平均值时的嵌套选择,mysql,sql,Mysql,Sql,我有两张桌子: Wokers-持有员工id、雇佣公司、合同类型,比如a或b +----+------------+----------+ | id | company_id | contract | +----+------------+----------+ | 1 | 1 | a | | 2 | 1 | b | | 3 | 3 | b | | 4 | 2 | a
+----+------------+----------+
| 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将对结果集中的每一行计算子查询一次,但它可能有一个只运行一次的优化。