2

これを読んでくれてありがとう。私はSQLが得意ではないので、愚かな間違いを許してください...

これが取り引きです、私は4つのテーブルを持っています(簡単にするために、基本的なフィールドとテーブル間の依存関係のみを示します):

  1. 会社: companyId、companyName
  2. ユーザー: userId、userName
  3. プロジェクト: projectId、projectUserId、projectCompanyId、projectDate
  4. スタディ: studyProjectId

依存関係は次のようになります。

  • プロジェクトはクライアント (projectUserId) 向けであり、会社 (projectCompanyId) によって実行されます。
  • 同じプロジェクトに多数のスタディが存在する可能性がありますが、各スタディは 1 つのプロジェクト (studyProjectId) 用です。

これは私が書きたい種類のリクエストですが、現在は機能しません。

SELECT
    project.projectId,
    company.companyName,
    user.userName,
    COUNT( study.studyId ) AS numberStudies
FROM project, company, user, study
WHERE company.companyId = project.projectCompanyId,
AND user.userId = project.projectUserId,
AND study.studyProjectId = project.projectId
ORDER BY company.companyId, user.userId, project.projectDate;

numberStudies がスタディの総数と等しい 1 つのレコードを返します。COUNTからを削除するとSELECT、必要なタイプの結果が得られますが、列はありませんnumberStudies(もちろん)。私が取得しようとしていることを理解してほしいのですが、ここで何が間違っていますか?

よろしくお願いします:)

編集: 可能であれば、numberStudiesが 0 の場合でもレコードを表示するように要求したいと思います。

4

2 に答える 2

2

コメントのように、GROUP BY集計結果が必要な場合は句が必要です (「プロジェクト、会社、およびユーザーごとの調査の数」が必要なようです)。したがって、最初に行うことは以下を追加することです。

GROUP BY project.projectId, company.companyName, user.userName

この 3 つの列は、リストにある (集計されていない) 3 つの列とまったく同じであることに注意してくださいSELECT

SELECT
    project.projectId,
    company.companyName,
    user.userName,
    COUNT(study.studyId) AS numberStudies
FROM project, company, user, study
WHERE company.companyId = project.projectCompanyId,
  AND user.userId = project.projectUserId,
  AND study.studyProjectId = project.projectId
GROUP BY project.projectId, company.companyName, user.userName
ORDER BY company.companyId, user.userId, project.projectDate ;

これにより、必要なものが表示されますが、まだいくつかの問題があります。

  • まず、WHERE句の条件で暗黙的な結合の古い (SQL-89) 構文を使用しています。この構文は非推奨ではありませんが、キーワードを使用した新しい (20 年前の SQL-92) 構文にJOINはいくつかの利点があります。
  • 読みやすくするために、テーブルのエイリアスを追加できます。
  • 同じ名前の会社またはユーザーが 2 人存在する可能性があるため、名前だけでなく ID でグループ化する必要があります。
  • 明示的なJOIN構文の利点の 1 つは、結合する行がない場合でも簡単に結果が得られることです (プロジェクトのスタディがない場合に表示したい場合など)。ちょうどテーブルLEFT JOINstudy

したがって、クエリは次のようになります。

    SELECT
        p.projectId,
        c.companyName,
        u.userName,
        COUNT(s.studyId) AS numberStudies
    FROM 
        project AS p
      JOIN 
        company AS c  ON c.companyId = p.projectCompanyId
      JOIN 
        user AS u     ON u.userId = p.projectUserId
      LEFT JOIN 
        study AS s    ON s.studyProjectId = p.projectId
    GROUP BY 
        c.companyId,
        u.userId,
        p.projectId, 
        c.companyName,  u.userName
    ORDER BY 
        c.companyId, 
        u.userId, 
        p.projectDate ;
于 2013-06-26T07:22:32.193 に答える
0

おそらく、スタディとプロジェクトの間に LEFT JOIN が必要です

于 2013-06-25T18:51:03.560 に答える