エンジニア的な技術的なブログ

webエンジニアの開発の知見を書きます。PHP、javascript、postgres、mysql、あと多少のインフラ周りとか。

同じテーブルをjoinする方法 〜ECCUBEを参考例に〜

ECCUBEのカテゴリの表示で、プルダウンメニューをoptiongroupで1階層目のカテゴリに
まとめたいときにやったこと。

なぜこうやったかを詳しく知りたい場合はsmary のhtml_optionsをググってください。
配列をsmarty用にいい感じにしたいからですので。

1階層目だけをdtb_categoryから取得して、そこに2階層目のdtb_categoryをjoinする
同じテーブルのjoinってやったことなかったんで、へーなるほどってことでメモ

まず結果から

SELECT 
	ccat.category_id as category_id,
	ccat.category_name as category_name,
	pcat.category_name as parent_category_name
FROM 
	(SELECT 
		*
	FROM 
		dtb_category
	WHERE
		level = 1 AND del_flg = 0) pcat
INNER JOIN 
	(SELECT 
		*
	FROM 
		dtb_category
	WHERE
		level = 2 AND del_flg = 0) ccat
ON 
	pcat.category_id = ccat.parent_category_id
ORDER BY 
	ccat.parent_category_id

FROM 句のサブクエリで1階層目(level = 1)だけを取得して、そのテーブルにエイリアス張って
その結果のテーブルに対してjoinする

あ、この場合は、2階層目以下のカテゴリの数だけレコードが欲しいので、
inner joinです。

あとは、それを親カテゴリIDでソートしてあげれば終了。


まぁ、単純っすね
こんなかんじです。