忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/11/23 14:17 |
DoctrineのDISTINCTは正しく動作しない
Doctrine_Query::create()->from('HOGE a')->distinct(true)->select('a.fuga');

// Expected result : SELECT DISTINCT fuga FROM hoge.
// Actual result : SELECT DISTINCT id, fuga FROM hoge.
見ての通り、発行されるSQLに勝手にID(主キー)が入るので正しく動作しない。
DISTINCTをselect()内に持ってきたとしても勝手に書き換えられるので駄目。

http://stackoverflow.com/questions/7188219/how-to-select-distinct-query-using-symfony2-doctrine-query-builder
http://www.developpez.net/forums/d793147/php/php-sgbd/orm/doctrine/doctrine-select-distinct/

回避方法は「GROUP BYを使え」らしい。
ふざけてるの?
Doctrine_Query::create()->from('HOGE a')->select('a.fuga')->groupBy(a.fuga);

// SELECT id, fuga FROM hoge group by fuga.
一応想定と同じ結果は取得できるのだが、意味が全く異なるので正しい動作とは言いかねる。

結論
「DoctrineでDISTINCTするときは直接SQL書こう」
Doctrine::getConnectionByTableName('HOGE')->execute('SELECT DISTINCT fuga FROM hoge')->fetchAll();

ところでDISTINCTよりEXISTSの方が早いという記事をよく見かけるんだけど、
結合しないfugaテーブルでEXISTSを使うにはどうすればいいんだろう?
PR


2014/06/09 22:57 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<「Excel列名変換問題」をPHPで解く | HOME | 買ったものリスト 2014/06/08>>
忍者ブログ[PR]