2012-01-10 15 views
1

私は3つのテーブルを持っています。 最初のテーブルはアクティビティ、2番目はメンバ、最後はメッセージです。 アクティビティにはMembers_IDという名前の外部キーがあり、主キーはActivity_IDです。 メンバーの主キーはMembers_IDです。 メッセージにActivity_IDとMembers_IDが記録されました。 アクティビティを検索したいNATURAL JOINメンバーと私は の新しい列数が必要ですメッセージのmessage_IDここで、Activity_IDは同じです。ネストされたクエリとNATURAL JOINについてのSQLクエリ

NATURAL JOINを:

SELECT* 
    FROM Activities 
     NATURAL JOIN Members 
    WHERE Activities.Members_ID = Members.Members_ID; 

COUNT(MESSAGE_ID):

SELECT COUNT(message_ID) 
    FROM Message 
    WHERE Activity_ID = 123; 

を質問は次のとおりです。 一緒に上記の二つのことを検索する方法は? テーブルを持っていると思います。アクティビティNATURAL JOIN同じActivities.Members_ID のメンバーと、メッセージのテーブルからのCOUNT(message_ID)の仮想カラム。

+2

質問は何ですか?私は自然の結合構文を避けるだろう、

SELECT *, (SELECT COUNT(message_ID) FROM Message WHERE Activity_ID = a.Activity_ID AND Members_ID = m.Members_ID) AS Message_Count FROM Activities AS a NATURAL JOIN Members AS m WHERE a.Members_ID = m.Members_ID; 

しかし、 –

+0

質問は何ですか? – keni

+2

自然な結合を避けることをお勧めします。明示的にあなたの結合述語を述べる方が良い方法です、IMO。 –

答えて

0

おそらく、あなたはこのように、相関サブクエリを使用したい:

SELECT *, (SELECT COUNT(message_ID) FROM Message WHERE Activity_ID = a.Activity_ID AND Members_ID = m.Members_ID) AS Message_Count 
    FROM Activities AS a 
     JOIN Members AS m on a.Members_ID = m.Members_ID; 
+0

ありがとうございます。(SELECT COUNT(message_ID)FROMメッセージWHERE Activity_ID = a.Activity_IDとm_Members_ID は必要なものではありません。 同じアクティビティに2つのレコードがあります。 –

+0

SELECT *、(SELECT COUNT(message_ID)FROMメッセージWHERE Activity_ID = a.Activity_ID)AS Message_Count アクティビティからa JOINメンバーa.Members_ID = m.Members_ID; –

+0

これは正しい回答です。 ティム・レナーと皆さんありがとうございます。 –

0
SELECT a.Activity_ID, a.col1, a.col2, ..., a.colx, COUNT(mg.message_ID) 
    FROM Activities a 
     INNER JOIN Members m 
      ON a.Members_ID = m.Members_ID 
     INNER JOIN Message mg 
      ON a.Activity_id = m.Activity_ID 
    GROUP BY a.Activity_ID, a.col1, a.col2, ..., a.colx; 
+0

私はActivity_IDが結合mから来る必要があります。 Activity_ID = 123は単なる例です。 –

+0

@YuChunLin私の編集した答えを見てください。それはあなたが望むものにもっと似ていますか? –

+0

ありがとうジョー。しかし、それは私が望むもののように見えません。 –

1
WITH MessageTallies 
    AS 
    (
     SELECT Activity_ID, COUNT(message_ID) AS tally 
     FROM Message 
     GROUP 
      BY Activity_ID 
    ) 
SELECT * 
    FROM Activities 
     NATURAL JOIN Members 
     NATURAL JOIN MessageTallies 
UNION CORRESPONDING 
SELECT *, 0 AS tally 
    FROM Activities 
     NATURAL JOIN Members 
WHERE Activity_ID NOT IN (SELECT Activity_ID FROM MessageTallies): 
関連する問題