leet codeのSQL問題を1日1題解く【1148. Article Views I】
目次
初めに
今日もSQLの問題を解いて行きます。
問題
セットアップ
以下の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が実行されるのもなんとなく理解できます。
GROUP BYを使う時に、SELECTにGROUP BYで指定したカラム以外を指定するとエラーになる
GROUP BYを使う場合、SELECTにはGROUP BYで指定したカラムを指定しましょう
WHERE と HAVINGの違い
WHEREはあくまで、テーブルの行に対してのみしか条件を指定できません。 グループごとの行に対して条件を指定したい場合、HAVINGを使います。
ORDER BY
ORDER BYを使うことで、SELECTした結果を昇順または降順に並べ替えることができます。(デフォルトはASCです)
SQL文を書くときにカラム名やテーブル名をバッククォートで囲む理由
MySQL側での予約語は、テーブル名やカラム名などに使うことはできません。 ただし、MySQLでは予約語をバッククォートで囲むことで、テーブル名やカラム名として使用可能になります。普通はテーブル名やカラム名を予約語にしない気がするので、一応知識として持っておきます。
解答
以下のSQL文を実行したら、無事クリアできました。
SELECT author_id AS id FROM `Views` WHERE author_id = viewer_id GROUP BY author_id ORDER BY author_id
終わり
明日もやります!