次のデータを含む 3 つのテーブルがあります。
接続と呼ばれる最初のテーブルconnections.username1
は、connections.username2
フォローする人であり、フォローされる人です。
次の行があります。
connections.username1 | connections.username2
mikha | guy
guy | maricela
maricela | guy
質問と呼ばれる 2 番目のテーブル。と呼ばれる質問者用の列と、 とquestions.asker_username
呼ばれる質問を受ける人用の列がありますquestions.target_username
。質問者が「sys.tem」と呼ばれ、ターゲットが「every.one」と呼ばれる場合、それはグローバルな質問と見なされ、すべてのメンバーが回答できます。
匿名ユーザーが尋ねることができ、その IP は として記録されますasker_username
。
次の行があります。
questions.id | questions.asker_username | questions.target_username | questions.question
1 | mikha | guy | what's your name?
2 | mikha | maricela | What's your age?
3 | guy | mikha | what's your name?
4 | maricela | guy | favorite food?
5 | xx.xx.xxx.xx | mikha | favorite pet?
6 | xx.xx.xxx.xx | guy | first name?
7 | xx.xx.xxx.xx | maricela | first name?
8 | sys.tem | every.one | what's ur name?
9 | sys.tem | every.one | favorite movie?
10 | sys.tem | every.one | favorite game?
3 番目の表は回答と呼ばれます。Answers テーブルの ID は質問 ID と同じです。このテーブルには、ID、ユーザー名、および回答の列があります。
answers.id | answers.username | answers.answer
1 | guy | my name is guy
2 | maricela | my name is maricela
3 | mikha | my name is mikha
4 | guy | pizza
8 | guy | guy is my name
8 | maricela | maricela is my name
9 | maricela | avatar
「mikha」と彼がフォローしている人に関する次の条件を組み合わせたクエリが必要です。
1) questions.asker_username
「ミカ」ではありません
2) questions.target_username
「ミカ」または彼がフォローしているユーザーのいずれかです。
3) questions.target_username
「every.one」に等しく、「mikha」と答えた場合、質問を表示します。
4) questions.target_username
「every.one」に等しく、「mikha」がフォローしている人のいずれかが回答した場合、質問とその回答を示します。mikha さんがフォローしているユーザーからの回答がない場合は、質問を表示しません。
5) questions.target_username
「every.one」に等しく、誰もまったく答えない場合は、質問を 1 回表示します。
6) questions.target_username
「every.one」に等しく、「mikha」から回答がなく、フォローしているユーザーからも回答がない場合は、質問を 1 回だけ表示します。
次のクエリを使用します。
SELECT questions.id,answers.id,questions.asker_username,questions.target_username,
answers.username,questions.question,answers.answer
FROM questions
LEFT JOIN answers ON (questions.id = answers.id)
LEFT JOIN connections ON connections.username1 = 'mikha'
AND (questions.target_username = connections.username2
OR questions.asker_username = connections.username2
OR connections.username2 = answers.username)
WHERE questions.asker_username <> 'mikha'
AND (questions.target_username = 'mikha'
OR questions.target_username = connections.username2
OR (questions.target_username = 'every.one'
AND (answers.username = 'mikha'
OR answers.username = connections.username2
OR answers.username IS NULL)
)
)
GROUP BY questions.id,answers.username
私が期待する結果:
questions.id | answers.id | questions.asker_username | questions.target_username | answers.username | questions.question | answers.answer
3 | 3 | guy | mikha | mikha | what's your name? | my name is mikha
4 | 4 | maricela | guy | guy | favorite food? | pizza
5 | 5 | xx.xx.xxx.xx | mikha | NULL | favorite pet? | NULL
6 | 6 | xx.xx.xxx.xx | guy | NULL | first name? | NULL
8 | 8 | sys.tem | every.one | NULL | what's ur name? | NULL
8 | 8 | sys.tem | every.one | guy | what's ur name? | guy is my name
9 | 9 | sys.tem | every.one | NULL | favorite movie? | NULL
10 | 10 | sys.tem | every.one | NULL | favorite game? | NULL
私が実際に得た結果:
questions.id | answers.id | questions.asker_username | questions.target_username | answers.username | questions.question | answers.answer
3 | 3 | guy | mikha | mikha | what's your name? | my name is mikha
4 | 4 | maricela | guy | guy | favorite food? | pizza
5 | 5 | xx.xx.xxx.xx | mikha | NULL | favorite pet? | NULL
6 | 6 | xx.xx.xxx.xx | guy | NULL | first name? | NULL
8 | 8 | sys.tem | every.one | guy | what's ur name? | guy is my name
10 | 10 | sys.tem | every.one | NULL | favorite game? | NULL
http://sqlfiddle.com/#!2/29929e/1でスキームを作成して、実際に得た結果を示しました
ありがとう :)