Mysql 如何使用dql从数据表中获取唯一值?

Mysql 如何使用dql从数据表中获取唯一值?,mysql,doctrine,dql,Mysql,Doctrine,Dql,我有一个表,其中有一列存储了各种值。我想使用dql从该表中检索唯一的值 Doctrine_Query::create() ->select('rec.school') ->from('Records rec') ->where("rec.city='$city' ")

我有一个表,其中有一列存储了各种值。我想使用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是唯一的,因为它是一个自动递增的值。是的,我在城市栏中有一些真实的重复项,如:德里和德里。正确的。。现在,当我试图从中获取数据时,我得到了两次德里。如何进行如下查询:

  select DISTINCT rec.city where state="xyz";
因为这会给我正确的输出

EDIT3:


有谁能告诉我如何解决这个问题吗?

请重新回答

在我的本地计算机上检查了这个-没有工作。因此,我建议您使用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();
$dbh=Doctrine\u管理器::connection()->getDbh();
$stmt=$dbh->prepare('SELECT DISTINCT(rec.city),其中rec.state=:state');
$stmt->bindParam(':state',$state);
$stmt->execute();
$result=$stmt->fetchAll();
提示

我建议您使用
city
列中的城市参考列表,而不是纯文本,以提高灵活性和更好的性能。

原因原则始终是将主键添加到字段列表中的原因就在列表内部。当条令从数据库中获取行时,它会将它们转换为对象层次结构,并使用主键引用模型对象。在您的案例中,不需要这种行为,因为只需要城市名称

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

  • 尝试使用。RawSql对不同的查询有特殊的处理
  • $q=Doctrine\u RawSql::create()
    ->选择('DISTINCT{rec.city}')
    ->from('Records rec')
    ->其中('rec.state=?',$state) ->addComponent('rec','Record')

    $cities=$q->execute()

  • 使用基于对象的非对象层次结构或。这可能会阻止条令获取主键字段来初始化模型类。有关更多信息,请参阅文档(无法发布链接-新用户。抱歉)
  • $q=Doctrine\u Query::create()
    ->选择('DISTINCT rec.city')
    ->from('Records rec')
    ->其中(“记录状态=?”,$state)

    $cities=$q->execute(array(),Core::HYDRATE\u SCALAR)

    $cities应该包含一个数组,数组中的键类似于'rec_city'

    请注意where语句中占位符的使用,让条令自己进行转义是一种很好的做法,而不是与之抗争。

    您可以使用类来完成此操作。下面是我刚刚在自己的数据库上做的一个测试:

    <?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";
    }
    
    ?>
    

    DISTINCT是一个聚合函数。因为这样的原则不能将你的结果变成目标。使用不同的水合策略,就像bartman建议的那样

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

    对我来说很好

    在RawSql中没有必要 代替->选择('DISTINCT rec.city')

    使用->选择('DISTINCT(rec.city)as city')

    您可以使用分组方式吗

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

    取决于您使用的版本,但我遇到了相同的问题,并且->distinct()为我工作

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

    这一条适合我。

    如果您想在存储库中使用条令查询,以下几条适合我:

    注意:我使用的是Oracle11g,但同样的查询应该适用于MySQL

        $sql =
          "
          SELECT 
            DISTINCT d.fieldname 
            
          FROM 
            Oracle:Dmessage d
          "
        ;
        $query = $this->getEntityManager()->createQuery($sql);
        $results = $query->getResult();
    

    尝试将
    select('img.')
    更改为
    select('DISTINCT img.')
    DISTINCT
    适用于您选择的所有列。IOW
    selectdistinct a,b,c
    可以被视为
    selectdistinct(a,b,c)
    。这对你来说是个问题吗?你在[code>rec.city
    有口是心非的地方吗?他们真的是口是心非吗?(城市名称会成为一个糟糕的键,它们不是唯一的。)@只要有人检查一下edit2下的文本,从记录r中选择不同的r.id作为r_uid,r.school作为r_uschool,其中r.City=?这是查询生成的sql。。但是检查不同的关键字位置。它的id列不是学校列。检查问题中的编辑部分。谢谢,这不是解决办法。我不明白为什么这个问题不能被解决…???这是删除id的rec.city周围的括号。如果没有它,原则会将id和city带回来,并且没有区别。助教。请保存我创建另一个表的过程。请永远不要使用诸如
    ->where(“rec.state='$state')
    之类的未经扫描的查询参数,除非您希望您的web很容易被黑客攻击(SQL注入)。而是使用安全参数:`->where('rec.state=:state')->setParameter('state',$state)`
        $sql =
          "
          SELECT 
            DISTINCT d.fieldname 
            
          FROM 
            Oracle:Dmessage d
          "
        ;
        $query = $this->getEntityManager()->createQuery($sql);
        $results = $query->getResult();