11

さまざまな値が格納されている列があるテーブルがあります。dqlを使用してそのテーブルから一意の値を取得したいと思います。

         Doctrine_Query::create()
                    ->select('rec.school')
                    ->from('Records rec')                   
                    ->where("rec.city='$city' ")                                    
                    ->execute();        

今、私は一意の値だけが必要です。誰かがそれを行う方法を教えてもらえますか...

編集

テーブル構造:

CREATE TABLE IF NOT EXISTS `records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `school` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16334 ;

これは私が使用しているクエリです:

   Doctrine_Query::create()
          ->select('DISTINCT rec.city')
          ->from('Records rec')                   
          ->where("rec.state = '$state'")                                    
             // ->getSql();
           ->execute();                 

このためのSQLを生成すると、次のようになります。

SELECT DISTINCT r.id AS r__id, r.city AS r__city FROM records r WHERE r.state = 'AR'

次に、生成されたsql :::: DISTINCTが'id'列にあることを確認します。ここで、都市列にDistinctが必要です。誰もがこれを修正する方法を知っています。

EDIT2

Idは一意であるため、自動増分値になります。デリーやデリーのように、都市の列に実際の重複がいくつかあります。そうです..データを取得しようとすると、デリーが2回取得されます。このようなクエリを作成するにはどうすればよいですか?

  select DISTINCT rec.city where state="xyz";

これにより、適切な出力が得られます。

EDIT3:

このクエリを理解する方法を教えてくれる人は誰でも..???

4

9 に答える 9

18

使用しているバージョンによって異なりますが、同じ問題が発生し、-> distinct()が機能しました。

Doctrine_Query::create()
      ->select('rec.city')->distinct()
      ->from('Records rec')                   
      ->where("rec.state = '$state'")                                    
       ->execute();     
于 2011-06-27T14:50:54.257 に答える
5

GROUP BYを使用できますか?

Doctrine_Query::create()
    ->select('rec.school')
    ->from('Records rec')                   
    ->where("rec.city='$city' ")                                    
    ->groupBy('rec.school')   
    ->execute();
于 2010-06-08T23:59:19.050 に答える
3

RawSqlには必要ありません
->select('DISTINCT rec.city')の代わりに-
> select('DISTINCT(rec.city)as city')を使用します

于 2010-05-12T06:42:08.437 に答える
2

これを実現するには、 Raw_Sqlクラスを使用できます。これが私が自分のデータベースで行ったテストです。

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'library');

require('Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

Doctrine::loadModels('application/models/generated');
Doctrine::loadModels('application/models');

$dm=Doctrine_Manager::getInstance();
$conn = $dm->openConnection("mysql://dbuser:dbpass@localhost/database");  //changed actual values...
$q = new Doctrine_RawSql($conn);

$q->select('{c.name}')
   ->distinct()
   ->from('contactlist c')
   ->addComponent('c', 'Contactlist');

//this outputs:  SELECT DISTINCT c.name AS c__name FROM contactlist c
echo $q->getSqlQuery() . "<br>\n"; 

$contacts = $q->execute();
foreach($contacts->toArray() as $contact){
    echo $contact['name'] . "<br>\n";
}

?>
于 2010-02-02T16:15:46.163 に答える
2

DISTINCTは集計関数です。そのため、Doctrineは結果をオブジェクトに水和することはできません。バートマンが提案したように、別の水分補給戦略を使用してください。

$q = Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->execute(array(), Doctrine_Core::HYDRATE_SCALAR);

私のためにうまくいった

于 2010-03-05T13:02:42.330 に答える
1

Doctrineが常にフィールドリストに主キーを追加している理由は、Hydration内にあります。Doctrineはデータベースから行をフェッチするときに、それらをオブジェクト階層にハイドレイト(=変換)し、主キーを使用してモデルオブジェクトを参照します。あなたの場合、都市名だけが重要なので、この動作は望ましくありません。

私は2つの解決策を提案しますが、残念ながら現在それらをテストすることはできません。

  1. Doctrine_RawSqlを使用してみてください。RawSqlには、DISTINCTクエリの特別な処理があります。

$q = Doctrine_RawSql::create()
->select('DISTINCT {rec.city}')
->from('Records rec')
->where('rec.state = ?', $state) ->addComponent('rec', 'Record');

$cities = $q->execute()

  1. 非オブジェクト階層ベースのHydratorを使用します。これにより、Doctrineがモデルクラスを初期化するために主キーフィールドをフェッチできなくなる可能性があります。詳細については、ドキュメント(リンクを投稿できません-新しいユーザー。申し訳ありません。)を参照してください。

$q = Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->where("rec.state = ?", $state);

$cities = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR);

$ citysには、「rec_city」のようなキーを持つ配列の配列が含まれている必要があります。

?whereステートメントでのプレースホルダーの使用に注意してください。Doctrineにエスケープを行わせ、自分で苦労しないようにすることをお勧めします。

于 2010-02-02T03:32:33.310 に答える
1
$query = $this->getEntityManager()->createQueryBuilder()
                    ->select('DISTINCT(p.document)')
                    ->from('Products', 'p');

これは私のために働きます。

于 2013-05-20T10:05:58.417 に答える
0

再回答

私のローカルコンピュータでこれをチェックしました-動作しませんでした。それで、これが強化または修正されるまで、PDOを使用するようにアドバイスさせてください。

$dbh = Doctrine_Manager::connection()->getDbh();
$stmt = $dbh->prepare('SELECT DISTINCT(rec.city) FROM <tablename> WHERE rec.state = :state');
$stmt->bindParam(':state', $state);
$stmt->execute();
$result = $stmt->fetchAll();

ヒント柔軟性とパフォーマンスの向上のために、プレーンテキストではなく、列の都市のリストを参照する外部キー
を使用することをお勧めします。city

于 2010-01-29T12:25:20.457 に答える
0

リポジトリでDoctrineクエリを使用したい場合は、次のように機能します。

注:私はOracle 11Gを使用していますが、これと同じクエリがMySQLで機能するはずです。

    $sql =
      "
      SELECT 
        DISTINCT d.fieldname 
        
      FROM 
        Oracle:Dmessage d
      "
    ;
    $query = $this->getEntityManager()->createQuery($sql);
    $results = $query->getResult();
于 2021-04-03T13:32:53.027 に答える