Mysql 如何使用dql从数据表中获取唯一值?
我有一个表,其中有一列存储了各种值。我想使用dql从该表中检索唯一的值Mysql 如何使用dql从数据表中获取唯一值?,mysql,doctrine,dql,Mysql,Doctrine,Dql,我有一个表,其中有一列存储了各种值。我想使用dql从该表中检索唯一的值 Doctrine_Query::create() ->select('rec.school') ->from('Records rec') ->where("rec.city='$city' ")
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
列中的城市参考列表,而不是纯文本,以提高灵活性和更好的性能。原因原则始终是将主键添加到字段列表中的原因就在列表内部。当条令从数据库中获取行时,它会将它们转换为对象层次结构,并使用主键引用模型对象。在您的案例中,不需要这种行为,因为只需要城市名称
我建议两种解决方案,不幸的是,我现在无法测试它们
$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
适用于您选择的所有列。IOWselectdistinct 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();