GA

2021/10/05

PHPカンファレンス2021に参加しました…のポエム

PHP Conference Japan 2021 に参加しました。


参加といっても家族との兼ね合いだったりで、正直「自分のセッション以外はほぼほぼ不参加」でした(´・ω・`)


「オンラインxx」の「xx」が終わった瞬間に現実(?)に引き戻される感があるので、来年はオフラインでやれる状態になっていると良いですね。。


----


最初は応募しよう応募しようと思いつつ、 転職 もしたばっかで案外忙しい…と諦めていたんですが、アディショナルタイムのツイートを見ていてもたってもいられなくなり、結局応募しました。



俺がしゃべれることといえば当然MySQLの話しかないわけですが、ここしばらく(?)「俺がWebApp開発しているような人に伝えられることって何だろう」と考えて(かつ、現実的に俺がちゃんと資料を作れる範囲で)これにしようと決めました。



ちなみに「もうギリギリ」は応募締め切りギリギリ(アディショナルタイム期間だったので)ってことです。


31もスターをいただけて、無事採択されました。

つけていただいた皆様、ありがとうございます。





ところがどっこい(?) ふと気になるセッションを見つけます。




Σ(゚д゚lll) ダダ被りの予感!?




ちなみに、出来上がったのは発表前日の10/2(土)だったので、まみーさんにはドラフトしか見てもらっていません(それも9/30(木) だった。まみーさんのは先に見せてもらってた…

なお、途中で気が変わった(?)のか、スローログの話は結局しませんでした。でもEXPLAINとインデックスに絞ったおかげで、MySQLとPHPのいい感じの話になれたな、と結果オーライな気がしています。


出来上がりはこんな感じです。



モノは 日々の覚書: サイボウズさんの開運研修(データベース)で話してきました の時の「MySQLとインデックスと私」をもうちょっと(?)カジュアルにしたものです。


カバリングインデックスやネクストキーロックの話題を捨てて、その分「PHPのサンプルコードっぽいものでインデックスの刈り込み方をイメージしてもらえる」ようにしています。


前日までは130ページ以上あった(練習問題があと3パターンくらいあった)んですが、到底時間に収まらなかったので最後のリハーサルで切り詰めました。ぴったり60分でした。よかった。


ご笑覧いただければ幸いです!

2021/10/04

LEFT JOINのONに書くかWHEREに書くかで結果セットが変わるやつのサンプル

TL;DR

  • リテラルと比較する条件のこと
    • INNER JOINならONでもWHEREでもどっちでも同じ結果になる、マッチしない行は影も形も出てこない
    • OUTER JOINならONに書いた時は「それにマッチしなければNULL詰めの行が返る」、WHEREに書いた場合は「それにマッチしない行は表示されない(= INNER JOINと一緒)」
  • LEFT JOINの左右どちらのテーブルでもこうなるのはちょっと面白い(?)
    • ゆっくり考えればわかるんだけど、2度見してしまった。。

CREATE TABLE t1 (num int);
INSERT INTO t1 VALUES (1), (2), (3);

-- INNER JOIN で WHERE
SELECT * FROM t1 JOIN t1 AS t2
ON t1.num = t2.num
WHERE t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- INNER JOIN で ON
SELECT * FROM t1 JOIN t1 AS t2
ON t1.num = t2.num AND t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- LEFT JOIN の右側で WHERE
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num
WHERE t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- LEFT JOIN の右側で ON
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num AND t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    2 | NULL |
|    3 |    3 |
+------+------+
3 rows in set (0.00 sec)

-- LEFT JOIN の左側で WHERE
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num
WHERE t1.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- LEFT JOIN の左側で ON
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num AND t1.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    2 | NULL |
|    3 |    3 |
+------+------+
3 rows in set (0.00 sec)