質問: i.section where category='地名' order by ryoko_no ```
回答: `JOIN`の構文について誤解があるように思われます。 `SELECT`文の基本的な構造は ``` SELECT 列リスト FROM テーブル[ WHERE 条件][ ORDER BY ソートキー] ``` のようになっています。ですので副問い合わせや`UNION`を無視すれば`WHERE`句は通常1回しか出現しません。そして`JOIN`は上の*テーブル*の部分の文法で、これは ``` FROM テーブル (INNER|LEFT|RIGHT|FULL) JOIN テーブル ON 条件 ``` のように使用します。ですので`JOIN`時に追加の条件が指定したければ`AND`で指定するのが一般的です。 > > left join ini_file_tekina_table i on r.syuppatuti_id = i.section **AND** category = '地名' > > > この方法を使うと質問のSQLは ``` SELECT r.ryoko_no , r.syuppatuti_id , i1.item AS 出発地 , r.mokutekiti_id , i2.item AS 目的地 FROM ryoko_data r LEFT JOIN ini_file_tekina_table i1 ON r.syuppatuti_id = i1.section AND i1.category='地名' LEFT JOIN ini_file_tekina_table i2 ON r.mokutekiti_id = i2.section AND i2.category='地名' ORDER BY r.ryoko_no ``` のようになります。 なお元のSQLのように`WHERE`句に条件を指定することもできますが、ここでは`LEFT JOIN`を使用しているので`ini_file_tekina_table`に結合対象のレコードが存在しなかった場合の動作が変化します。`ON`に`category`の条件を指定した場合、対象の出発地/目的地が存在しない`ryoko_data`レコードも`SELECT`対象になりますが、`WHERE`で指定した場合は結合後のレコードに対して`category`の判定が行われますので、`ini_file_tekina_table`のレコードが存在しない組み合わせは値が`NULL`になり条件と一致しません。ですので`LEFT JOIN`が指定されていますが、実質的に`INNER JOIN`と同一の動作になります。