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 generated:::: DISTINCT在“id”列上,因为我希望在 city 列上区分。任何人都知道如何解决这个问题。

编辑2

Id 是唯一的,因为它是一个自动增量值。是的,我在城市列中有一些真正的重复项,例如:德里和德里。对..现在当我试图从中获取数据时,我两次到达德里。我怎样才能进行这样的查询:

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

因为这会给我正确的输出。

编辑3:

谁能告诉我如何弄清楚这个查询..???

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

DISTINCT is an aggregation function. As such Doctrine cannot hydrate your result into objects. Use a different hydration strategy, like bartman has suggested.

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

worked fine for me

于 2010-03-05T13:02:42.330 回答
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 回答
1

Doctrine 总是将主键添加到字段列表的原因在于 Hydration 内部。当 Doctrine 从数据库中获取行时,它会将它们水合(=转换)为对象层次结构并使用主键引用模型对象。在您的情况下,不需要这种行为,因为只对城市名称感兴趣。

我建议了两种解决方案,不幸的是我现在无法测试它们。

  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);

$cities 应该包含一个数组,其键为“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 回答