Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

leet codeのSQL問題を1日1題解く【1148. Article Views I】

目次

初めに

今日もSQLの問題を解いて行きます。

問題

leetcode.com

セットアップ

以下のSQL文をローカル環境で実行します。

Create table If Not Exists Views (article_id int, author_id int, viewer_id int, view_date date);
Truncate table Views;
insert into Views (article_id, author_id, viewer_id, view_date) values ('1', '3', '5', '2019-08-01');
insert into Views (article_id, author_id, viewer_id, view_date) values ('1', '3', '6', '2019-08-02');
insert into Views (article_id, author_id, viewer_id, view_date) values ('2', '7', '7', '2019-08-01');
insert into Views (article_id, author_id, viewer_id, view_date) values ('2', '7', '6', '2019-08-02');
insert into Views (article_id, author_id, viewer_id, view_date) values ('4', '7', '1', '2019-07-22');
insert into Views (article_id, author_id, viewer_id, view_date) values ('3', '4', '4', '2019-07-21');
insert into Views (article_id, author_id, viewer_id, view_date) values ('3', '4', '4', '2019-07-21');

知らなかった or 理解があやふやな知識

SELECT文の評価順序

SELECT文は以下のの順序で評価されます

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. HAVING
7. SELECT
8. DISTINCT
9. ORDER BY
10. TOP(LIMIT)

ORDER BYを書くと取得した行に対してソートを実行できます。ソートは重い処理なので、SELECTした後の結果に対してソートを実行した方が、考慮すべき行数が減るので、この順序で実行されるのはなんとなく理解できます。 WHEREがGROUP BYより上にあるのも、グループ化させるよりも前にWHEREの条件を適用させた方が、考慮すべき行数が減るので、WHEREの後にGROUP BYが実行されるのもなんとなく理解できます。

qiita.com

GROUP BYを使う時に、SELECTにGROUP BYで指定したカラム以外を指定するとエラーになる

GROUP BYを使う場合、SELECTにはGROUP BYで指定したカラムを指定しましょう

qiita.com

WHERE と HAVINGの違い

WHEREはあくまで、テーブルの行に対してのみしか条件を指定できません。 グループごとの行に対して条件を指定したい場合、HAVINGを使います。

ORDER BY

ORDER BYを使うことで、SELECTした結果を昇順または降順に並べ替えることができます。(デフォルトはASCです)

www.w3schools.com

SQL文を書くときにカラム名やテーブル名をバッククォートで囲む理由

MySQL側での予約語は、テーブル名やカラム名などに使うことはできません。 ただし、MySQLでは予約語をバッククォートで囲むことで、テーブル名やカラム名として使用可能になります。普通はテーブル名やカラム名予約語にしない気がするので、一応知識として持っておきます。

qiita.com

rnk.mitelog.jp

解答

以下のSQL文を実行したら、無事クリアできました。

SELECT author_id AS id
FROM `Views`
WHERE author_id = viewer_id
GROUP BY author_id
ORDER BY author_id

終わり

明日もやります!

参考記事

MySQL AND, OR, NOT Operators

MySQL | 比較演算子の使い方