想象以下场景:公司的员工可以对任意问题(整数值)进行投票。
我有一个复杂的请求,我想获取五个信息:
- 公司的名称
- 每家公司的平均投票价值
- 在职员工人数
- 票数
- 参与(票数/员工人数)
SQL 查询只能获取当前用户所在公司的投票。
因此,在您看到表声明的摘录之后,我正在访问四个不同的表:
User
- id
Company
- id
- name
Employment
- user_id (FK User.id)
- company_id (FK Company.id)
Vote
- company_name
- vote_value
- timestamp
User
并Company
通过Employment
(n:m 关系,但需要是额外的表)相关。该表Vote
不应通过 PK/FK 关系连接,但可以通过公司名称 ( Company.name = Vote.company_name
) 与公司相关联。
我设法通过以下 SQL 查询正确地获取了除员工人数之外的所有信息:
SELECT
c.name AS company,
AVG(v.vote_value) AS value,
COUNT(e.user_id) AS employees,
COUNT(f.face) AS votes,
(COUNT(e.user_id) / COUNT(v.vote_value)) AS participation
FROM Company c
JOIN Employment e ON e.company_id = c.id
JOIN User u ON u.id = e.user_id
JOIN Vote v
ON v.company_name = c.name
AND YEAR(v.timestamp) = :year
AND MONTH(v.timestamp) = :month
AND DAY(v.timestamp) = :day
WHERE u.id = :u_id
GROUP BY v.company_name, e.company_id
employee
但是,该字段始终等于投票数,而不是获取正确数量的员工。(因此该participation
值也是错误的。)
有没有办法在没有子查询1的查询中执行此操作?我必须进行哪些更改才能使查询获取正确数量的员工?
1我正在使用 Doctrine2 并尽量避免子查询,因为 Doctrine 不支持它们。我只是不想把它拉进教义讨论中。这就是我将这个主题分解为 SQL 级别的原因。