最初は1行で書いていたんですが、内容が複雑になっていくにつれ煩雑になるので
どう書けば分かりやすいのかを自分なりにまとめてみます。
- ひよっこなのでできる限り分かりやすいのが良い
- インデントの幅は統一したい
- 分かりやすいからといって、SQL一文でやたらと行数取るのはなんとなく嫌
…で、書き進めると以下のようになりました。
- 予約語・関数などは大文字
- 主に、それぞれの句で行を分ける
- 各句の内容が長くなってきたら、インデントしつつ複数行にしてもOK
- ANDやらORやらが増えて()が分かりにくくなったら、インデントしつつ複数行にしてもOK
てきとうなサンプル
SELECT b.value
FROM table_a AS a
INNER JOIN table_b AS b ON b.value = a.value1
LEFT JOIN table_c AS c ON c.value1 = 'hoge1' AND c.value2 = 'hoge2' AND c.value3 = 0 AND c.value4 = b.value
LEFT JOIN table_d AS d ON d.value1 = 'hoge1' AND d.value2 = 'hoge2' AND d.value3 = 0 AND d.value4 = b.value
WHERE a.value2 = 'hogehoge'
AND b.status = 1
AND (
(c.date IS NULL AND ADDDATE(d.date, INTERVAL 86399 SECOND) > NOW())
OR (c.date IS NULL AND d.date IS NULL)
OR ADDDATE(c.date, INTERVAL 86399 SECOND) > NOW()
)
LIMIT 10
上記のようにLEFT JOIN~が長い場合は、そこも改行しても良いかもしれません。
てきとうなサンプル(LEFT_JOIN複数行版)
SELECT b.value
FROM table_a AS a
INNER JOIN table_b AS b ON b.value = a.value1
LEFT JOIN table_c AS c
ON c.value1 = 'hoge1' AND c.value2 = 'hoge2' AND c.value3 = 0 AND c.value4 = b.value
LEFT JOIN table_d AS d
ON d.value1 = 'hoge1' AND d.value2 = 'hoge2' AND d.value3 = 0 AND d.value4 = b.value
WHERE a.value2 = 'hogehoge'
AND b.status = 1
AND (
(c.date IS NULL AND ADDDATE(d.date, INTERVAL 86399 SECOND) > NOW())
OR (c.date IS NULL AND d.date IS NULL)
OR ADDDATE(c.date, INTERVAL 86399 SECOND) > NOW()
)
LIMIT 10
分かりやすいからといって、SQL一文でやたらと行数取るのはなんとなく嫌
こことの兼ね合いが徐々に苦しくなっていますが、
個人的にはこの程度の区切り方が好みです。