0

私は SQL や MySQL の完全な初心者ではありませんが、まだ学ぶべきことがかなりあることに気付きました。何度も試し、読んで、検索した後、私はこれについて頭を悩ませることができません。何かご指摘がありましたら、よろしくお願いします。

実際のデータと表を次のように簡略化しました。

スタッフと仕事の 2 つのテーブルが関連しています。さまざまなプロジェクトのスタッフに関するデータが含まれています。

スタッフ:

ID  Name    Unit     

1   Smith   Chicago
2   Clarke  London
3   Hess    Chicago

仕事:

StaffID   ProjectID

1          10
2          10
3          10
1          20
2          30
3          40
1          50
3          50

ゴール:

シカゴのスタッフがいるすべてのプロジェクトを、そのプロジェクトのすべてのスタッフの数とともにグループ化します。

期待される結果:

Project  Staff count

10        3
20        1
40        1
50        2

プロジェクト 30 は、そのメンバーがシカゴ出身ではないため、リストされていません。

以下の私のクエリは明らかに間違っています。プロジェクト スタッフ全体ではなく、シカゴ出身のプロジェクト メンバーのみがカウントされます。

SELECT 
    work.projectID as Project, COUNT(*) as "Staff count" 
FROM 
    staff 
JOIN
    work ON staff.ID=work.staffID
WHERE
    unit="Chicago"
GROUP BY
    work.projectID;
4

3 に答える 3

3

where 句を削除し、従業員の少なくとも 1 人がシカゴ出身であることを確認する having 句を追加します。

SELECT 
    work.projectID as Project, COUNT(*) as "Staff count" 
FROM 
    staff 
JOIN
    work ON staff.ID=work.staffID
GROUP BY
    work.projectID
HAVING
    count(case unit when 'Chicago' then 1 end) > 0;
于 2011-10-10T14:08:46.340 に答える
3

シカゴのテストをサブセレクトに入れます。
または、自己結合を使用することもできますが、サブ選択の方が理解しやすいと思います。

SELECT 
  w.projectid as project
  ,COUNT(*) as `staff count`
FROM work w
INNER JOIN staff s ON (w.staffID = s.id)
WHERE w.projectID IN (
  SELECT w2.projectID FROM work w2
  INNER JOIN staff s2 ON (w2.staffID = s2.id AND s2.unit = 'Chicago'))
GROUP BY w.projectid
于 2011-10-10T14:06:50.533 に答える
1

最後に:結果。@Johan と @a'r の助けに感謝します。@Johan は正しい軌道に乗ってくれました (私の場合)。

副選択を派生テーブルに変更し、これを projectID の Work テーブルと内部結合しました。

SELECT 
   w.projectID AS project
   ,COUNT(*) AS `staff count`
FROM work w
INNER JOIN 
    (SELECT DISTINCT w2.projectID 
        FROM work w2
        INNER JOIN staff s ON (w2.staffID = s.id AND s.unit = 'Chicago')) c
ON (w.projectID = c.projectID)
GROUP BY w.projectID
于 2011-10-12T13:55:44.390 に答える