次のシナリオを想像してください: 会社の従業員は、任意の質問 (整数値) に投票できます。
5 つの情報を取得する複雑な要求があります。
- 会社名
- 1社あたりの平均得票値
- 就業者数
- 投票数
- 参加(投票数/従業員数)
SQL クエリは、現在のユーザーが雇用されている企業の投票のみを取得します。
したがって、テーブル宣言の抜粋を見ると、4 つの異なるテーブルにアクセスしています。
User
- id
Company
- id
- name
Employment
- user_id (FK User.id)
- company_id (FK Company.id)
Vote
- company_name
- vote_value
- timestamp
User
および(n:m 関係ですが、追加のテーブルである必要があります)Company
によって関連付けられています。Employment
テーブル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 がサブクエリをサポートしていないため、サブクエリを回避しようとしています。これを Doctrine の議論に持ち込みたくなかっただけです。そのため、このトピックを SQL レベルに分解しました。