次のデータ抽出を(高速に)行うSQLを教えてくださ
自分がフォローしている人のつぶやきと、じぶんの呟きを含めて、日付順で表示するSQLを検討しています。
MYSQLの構文がかなり複雑になってしまったために、
もっと簡単に高速にSQLで記述する方法がありましたら教えて頂けませんでしょうか。
長文になり申し訳ございませんが、アドバイスいただけると幸いです。
テーブルは以下の3種類です。
●cutomer:登録者名を記録
<構造>
id(auto increment,key),name(名前)
<サンプルデータ>
0,"太郎"
1,"次郎"
2,"三郎"
3,"四郎"
●follow:誰が(my_user_id)、誰をフォローしているか(target_user_id)を記録
<構造>
id(auto increment,key),my_user_id,target_user_id
<サンプルデータ>
0,1,0
0,1,2
●tweet:つぶやきを記録
<構造>
id(auto increment,key),user_id,tweet_comment(つぶやき),date(つぶやき日時)
<サンプルデータ>
0,1,"次郎のつぶやきです","2011-01-01 00:00:00"
1,2,"三郎のつぶやきです","2011-02-01 00:00:00"
2,0,"太郎のつぶやきです","2011-03-01 00:00:00"
3,1,"次郎のつぶやきです","2011-04-01 00:00:00"
4,3,"四郎のつぶやきです","2011-05-01 00:00:00"
上記のサンプルデータを用いて、期待する出力結果をご説明します。
例として、入力値を「次郎」とすると、
「次郎」のつぶやきと、次郎がフォローしている太郎と三郎の呟きを表示したいです。
"次郎","次郎のつぶやきです","2011-01-01 00:00:00"
"三郎","三郎のつぶやきです","2011-02-01 00:00:00"
"太郎","太郎のつぶやきです","2011-03-01 00:00:00"
"次郎","次郎のつぶやきです","2011-04-01 00:00:00"
現状は、次郎とつぶやきselectと、次郎がフォローする太郎と三郎のつぶやきselectを
unionで結合する形式なっており、もうちょっと賢くできないものかと悩んでいます。
なお、対象の次郎のuser_id(サンプルでは"1")は予めわかっているものとします。
(
select customer.name,tweet.tweet_comment,tweet.date
from customer,tweet
where customer.id = 1 and customer.id = tweet.user_id
)
union
(
select customer.name,tweet.tweet_comment,tweet.date
from customer,tweet,follow
where follow.my_user_id = 1 and follow.target_user_id = tweet.user_id
and tweet.user_id = customer.id
)
order by table_tweet.date asc
お礼
GREATです。 回答頂いたSQL文でできました。 ありがとうございました。