Sql 条令:在规定的声明中?
我使用的是Symfony2和条令2,我对此查询有问题:Sql 条令:在规定的声明中?,sql,symfony,doctrine-orm,Sql,Symfony,Doctrine Orm,我使用的是Symfony2和条令2,我对此查询有问题: $query = $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)'); $result = $query->getArrayResult(); 我总是按a.id的顺序得到结果,即1,然后4,然后12,同时我想显示按id列表排序的结果:4,然后12,然后1 更新 感谢@Bram Gerritsent comment
$query = $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)');
$result = $query->getArrayResult();
我总是按a.id的顺序得到结果,即1,然后4,然后12,同时我想显示按id列表排序的结果:4,然后12,然后1
更新
感谢@Bram Gerritsent comment,我注册了一个自定义DQL函数字段,下面是我所做的:
namespace MyBundle\DQL;
$em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN(4,12,1)ORDER BY FIELD(4,12,1);
但是我得到了这个错误:[Syntax error]第0行,第75列:错误:字符串的预期结尾,get'(
您需要查看MySql
字段
函数
在本机MySql中,您可以执行以下操作:
ORDER BY FIELD(a.id,4,12,1)
field函数不是Doctrine 2发行版的一部分,但您可以从中获得它
有关使用条令2中的字段
功能的更多信息,请参见此
编辑
我已使用您的查询对其进行了测试,但出现了相同的语法错误。以下查询对我有效。不确定为什么不能直接使用按字段排序(a.id,4,12,1)
,但您必须首先在选择中创建一个隐藏的
字段
SELECT a, field(a.id,4,12,1) as HIDDEN field FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY field
EDIT2
我做了更多的调试和研究,DQL解析器似乎不支持order by子句中的字符串函数。我已经解决了这个问题并创建了一个。您需要查看MySql
字段
函数
在本机MySql中,您可以执行以下操作:
ORDER BY FIELD(a.id,4,12,1)
field函数不是Doctrine 2发行版的一部分,但您可以从中获得它
有关使用条令2中的字段
功能的更多信息,请参见此
编辑
我已使用您的查询对其进行了测试,但出现了相同的语法错误。以下查询对我有效。不确定为什么不能直接使用按字段排序(a.id,4,12,1)
,但您必须首先在选择中创建一个隐藏的
字段
SELECT a, field(a.id,4,12,1) as HIDDEN field FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY field
EDIT2
我做了更多的调试和研究,DQL解析器似乎不支持order by子句中的字符串函数。我已经解决了这个问题,并创建了一个。不如字段函数好,但应该可以工作:
SELECT output.a FROM (
SELECT a, ( CASE WHEN a.id = 4 THEN 1 WHEN a.id = 12 THEN 2 a.id = 1 THEN 3 END ) ord FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)) output ORDER BY output.ord
没有字段函数那么好,但应该可以工作:
SELECT output.a FROM (
SELECT a, ( CASE WHEN a.id = 4 THEN 1 WHEN a.id = 12 THEN 2 a.id = 1 THEN 3 END ) ord FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)) output ORDER BY output.ord
您的查询中有一个重复的
)
。请尝试:$em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id in(4,12,1)ORDER BY FIELD(4,12,1);
抱歉,不幸的是,stackoverflow上有一个错误,但我的代码$query=$em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id in(4,12,1)ORDER BY FIELD(4,12,1);,所以我仍然有相同的错误..我对您的新查询没有任何错误,但结果总是按如下顺序排列:1,4,12,不考虑ID在“field”语句和“in”中的顺序在语句中,当我使用查询时,我得到了正确的排序。你能得到原始SQL字符串并直接对DB执行它吗?$query->getSql()
这是这个条令查询中的原始SQL查询($query=$em->createQuery('SELECT a.id,field(12,4,1)作为MyBundle中的隐藏字段:Artiste a,其中a.id按字段排序');)----原始sql----“从Artister a0中选择a0.id作为id0,字段(12,4,1)作为sclr1,其中a0.id按照sclr1 ASC的(12,4,1)顺序排列”您在查询中有一个重复的)
。尝试:$em->createQuery('SELECT a FROM MyBundle:Artister a其中a.id按照字段(4,12,1)的顺序排列(4,12,1)。”
很抱歉,不幸的是,stackoverflow上出现了一个错误,但我的代码$query=$em->createQuery(从MyBundle中选择a:Artister a,其中a.id按字段(4,12,1)排序);因此,我仍然有相同的错误..我对您的新查询没有任何错误,但结果总是按如下顺序排列:1,4,12,不考虑ID在“field”语句和“in”语句中的顺序我在使用查询时得到了正确的排序。您能获得原始SQL字符串并直接对DB执行吗?$query->getSql()
这里是这个条令查询中的原始sql查询($query=$em->createQuery('SELECT a.id,field(12,4,1)作为MyBundle中的隐藏字段:Artister a,其中a.id按字段排序(12,4,1));----原始sql---'SELECT a0_id作为id0,field(12,4,1)作为Artister a0中的sclr1,其中a0_id按sclr1排序'