【MySQLでデータ分析】JOINで2つのテーブルを使う

[前回は久しぶりにSQLを書いて、分析に必要そうなデータを取ってきたりしました。](http://qiita.com/MKnkgw/items/45b97e6bab5deb9fe58f)前回の最後のほうで出したふたつの問題点のうち、今回はひとつめの「[URLを含むtweetでは対象として不十分](http://qiita.com/MKnkgw/items/45b97e6bab5deb9fe58f#url%E3%82%92%E5%90%AB%E3%82%80tweet%E3%81%A7%E3%81%AF%E5%AF%BE%E8%B1%A1%E3%81%A8%E3%81%97%E3%81%A6%E4%B8%8D%E5%8D%81%E5%88%86)」というところを解決します。

## 含まれているURLがブログのものか違うかを判別する
ここは、[hogelog](http://qiita.com/hogelog)がプログラムをちょちょいっと書いてくれました。私は[githubに公開されてるリポジトリ](https://github.com/hogelog/analytics_tools_for_maki)をクローンして、READMEに書かれているとおりにポチポチやっただけ。hogelogが作ってくれたプログラムでは、まずtweetに含まれている全てのURLとそれを展開したURLを「twitter_links」というテーブルにインサートしています。次に、各tweetに含まれるURL（ひとつのtweetに複数のURLが含まれている場合は、ひとつめのURL）が、[www.switch-science.com](https://www.switch-science.com/)なのか、[mag.switch-science.com](http://mag.switch-science.com/)なのか、それ以外のURLなのかを判別し、「twitter_attributes」というテーブルにインサートしています。
![twitter_attributes.png](https://qiita-image-store.s3.amazonaws.com/0/55954/3f67b873-664c-2325-af82-96d4f3ff7def.png)

これで、ブログのURLが含まれているtweetを取り出すことができそうです。

## 2つのテーブルを使う
さて。一歩一歩行きます。

まずは、hogelogがくれた「JOINを使うのだ」というヒントをもとに、適当に書いてみたのですが、実際のデータベースでは絶対にやってはいけないことをさっそくやってしまいました。

```sql:
SELECT * FROM twitter JOIN twitter_attributes
```
なんだか実行に時間がかかるなーと思っていたら、完全に失敗。適当にスクロールしてみても、ひとつ目のtweetのデータしか表示されない……
![失敗.png](https://qiita-image-store.s3.amazonaws.com/0/55954/5076b326-85a8-67a6-9a2d-fe41d8d8e377.png)

ちなみにデータの後ろの方にはtwitter_attributesのデータがちゃんと入ってます。twitterのひとつのデータに対して、twitter_attributesのデータがひとつひとつ別々にくっついて並んでいる…今はデータの数が500もないくらいだから「時間がかかるなー」とか言ってられましたが、実際のデータベースでこんなことやっちゃったら大変なことになります。JOINは集合の積を取るようです。そりゃ時間かかるわ…
![失敗2.png](https://qiita-image-store.s3.amazonaws.com/0/55954/071a8bcd-cf9f-be38-58ac-c7851393c86d.png)

というわけで、仕切り直しで

```sql:
SELECT * FROM twitter JOIN twitter_attributes on twitter.tweet_id=twitter_attributes.tweet_id;
```
今度はちゃんとtweet_idごとに1対1で取り出せました。
![成功.png](https://qiita-image-store.s3.amazonaws.com/0/55954/cdd3caba-dbb9-fb4a-ca64-9d821ae66262.png)

リンク先がブログであるtweetという条件を追加し、いくつかの要素を取り出します。

```sql:
SELECT tweet_text, impression, click_url FROM twitter JOIN twitter_attributes on twitter.tweet_id=twitter_attributes.tweet_id WHERE twitter_attributes.link_status=2;
```
![mag_impression_click.png](https://qiita-image-store.s3.amazonaws.com/0/55954/29635485-c624-e655-f1d4-79b88d99822e.png)

おおー。間違いなく取り出せているようです。
## おまけ？で分析っぽいことをしてみる。
私にはまだ統計の知識が足りません。なので現時点で分析っぽいことをしてみても、それが正しいのかどうか分からない。ですがせっかくなので、そもそも知りたかった「クリック率が高いのは何曜日なのか」をざっくり調べたいと思います。まずは曜日ごとにインプレッションとURLのクリック数を並べてみます。

```sql
SELECT DAYNAME(tweet_datetime + INTERVAL 9 HOUR), impression, click_URL FROM twitter
JOIN twitter_attributes on twitter.tweet_id=twitter_attributes.tweet_id 
WHERE twitter_attributes.link_status=2 ORDER BY 1;
```
![曜日_impression_clickurl.png](https://qiita-image-store.s3.amazonaws.com/0/55954/262101b1-37b7-655f-5d38-5b488520dee9.png)

うまく取り出せました。このデータをもとに、前回同様スプレッドシートなどで中央値求めたりするといいのかも。
※前回は全然気づいてなかったのですが、Twitter Analyticsからエクスポートしたデータに含まれる投稿時間データは、日本時間−9時間で表示されています。なので、`DAYNAME(tweet_datetime + INTERVAL 9 HOUR)`しないと正しい曜日が出せないのでした。

さらにおまけ。SQLでは割り算とか掛け算とかも普通にかけるようです。そこで、ブログへのリンクを含むtweetごとのクリック率を、クリック率順にざざっと並べてみたいと思います。

```sql
SELECT tweet_text, impression, click_URL, click_url/impression*100 FROM twitter
JOIN twitter_attributes on twitter.tweet_id=twitter_attributes.tweet_id 
WHERE twitter_attributes.link_status=2
ORDER BY 4;
```
![クリック率順.png](https://qiita-image-store.s3.amazonaws.com/0/55954/c5d3fc20-6ff3-bf7b-c5e3-491a177891b3.png)

内容とクリック率を並べてみていると、フォロワーさんがどんな内容に興味を持っているのかなんとなく見えてきます。分析っぽいぞ！

次はもうちょっと統計学っぽいことをやりたいと思います。