sql >> データベース >  >> RDS >> Mysql

結合方法には多くのリレーションテーブルがあり、タイプごとに結果を取得します

    LEFT JOINを使用する リレーションテーブルにデータがないことを確認するために、メインテーブルのレコードを保持できます。

    参照: MySQLLEFTJOINについて

    問題

    • 間違ったフィールド名pr.interview_id = i.interview_idpr.interview_id = i.idである必要があります interviewsにinterview_idフィールドがないため テーブルの場合、idになります フィールド-クエリに基づきます。
    • pr.interview_id = i.id where 条項participant_ratingの場合 テーブルには特定のインタビューのレコードがありません。これにより、結果セットからそのインタビューが削除されます。 LEFT JOINを使用する participant_ratingの場合 テーブル。
    • sr.interview_id = i.id where 条項system_ratingの場合 テーブルには特定のインタビューのレコードがありません。これにより、結果セットからそのインタビューが削除されます。 LEFT JOINを使用する system_ratingの場合 テーブルも。
    • Usage of AVG 動作しますが、SUM, COUNTなどの他の集計関数では動作しません .. 1対多の関係がある場合、結合すると同じ行に複数のレコードが存在するためです。

    解決策

    SELECT 
        i.id AS interview_id,
        i.candidate,  
        AVG(sr.rating) AS system_rating, 
        AVG(CASE WHEN pr.rater_type = 'Candidate' THEN pr.rating END) AS candidate_rating, 
        AVG(CASE WHEN pr.rater_type = 'Recruiter' THEN pr.rating END) AS recruiter_rating
    FROM interviews i
    LEFT JOIN system_rating sr ON sr.interview_id = i.id
    LEFT JOIN participant_rating pr ON pr.interview_id = i.id
    -- WHERE i.id IN (1, 2, 3) -- use whenever required
    GROUP BY i.id
    



    1. 単一のODBCExecuteNonQuery(C#)での複数の挿入ステートメント

    2. codeigniter上に構築されたPHPアプリがMySQLとmongoDBデータベースに同時に接続することは可能ですか?

    3. oracle diff:2つのテーブルを比較する方法は?

    4. OracleのRPAD()関数