[Symfony] PropelでSTRAIGHT_JOINヒントを使う
2009年02月04日(水)09:00|谷口
谷口です。
今回はかなりの小ネタです。 CriterionでaddJoinするとき、第三引数でJOINする方式を指定することができるのですが、STRAIGHT_JOINの指定をサポートしていません。(そもそもヒントですしね。。。) Ja/Users/Documentation/1.3/Criteria – Propel – Trac
以下のJOINタイプがサポートされています: Criteria::LEFT_JOIN Criteria::RIGHT_JOIN Criteria::INNER_JOIN デフォルトのJOINタイプは暗黙の(implicit)joinになります。これはINNER JOINと同じ効果がありますがSQLレベルでは違う書き方になっています。
ですが、実は文字列で指定すれば、STRAIGHT_JOINを指定することが可能です。例えば、Table1とTable2をTable1.idとTable2.table_1_idでSTRAIGHT_JOINする場合、下記のようにすることで実現できます。
$c = new Criteria;
$c->addJoin(Table1Peer::ID, Table2Peer::TABLE1_ID, 'STRAIGHT_JOIN');
$result = Table1Peer::doSelect($c);
生成されるSQL文は下記のようになります。
SELECT table1.ID, table1.COLUMN FROM table1 STRAIGHT_JOIN table2 ON (table1.ID=table2.TABLE1_ID)
※MySQL4系ではsyntax errorになります。 MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.1.1 JOIN 構文 MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.7.1 JOIN 構文
と、今回は小ネタでしたが、クエリチューニングが必要なケースで活躍すると思います。