【问题标题】:Define the order of result of a SQL Query in Doctrine在 Doctrine 中定义 SQL 查询的结果顺序
【发布时间】:2017-01-13 16:21:16
【问题描述】:

我在 Symfony2 - Doctrine 应用程序中的具体问题:

我想按自定义顺序(w.winnerType:'main','special','normal','web)对查询的搜索结果进行排序,即 NOT ASC 或 DSC ,

我已经尝试了ORDER BY the IN value list(指向 Stackoverflow 的链接)中提出的几个版本

版本 1

  $em = $this->getDoctrine()->getManager();
  $query = $em->createQuery (
     "select w
        FROM MyBundle:Winner w
        WHERE
            w.winnerType IN ('main', 'special', 'normal', 'web')  
.
        ORDER BY w.winnerType='main' DESC, w.winnerType='special' DESC,
            w.winnerType='normal' DESC, w.winnerType='web' DESC  
       ") ;

这给出了错误消息:

[语法错误]:错误应以字符串结尾,得到 '='

第 2 版

ORDER BY FIELD (w.winnerType, 'main','special', 'normal', 'web')    

给出错误信息

[语法错误] 错误:预期已知 函数,得到'FIELD'

第 3 版

ORDER BY CASE w.winnerType 
                    WHEN 'main' THEN 1
                    WHEN 'special' THEN 2
                    WHEN 'normal' THEN 3
                    WHEN 'web' THEN 4
                    ELSE 999

给出错误信息

QueryException: [Syntax Error] line 0, col 314: Error: Expected end of string, got 'w'

调试信息: CRITICAL - 未捕获的 PHP 异常 Doctrine\ORM\Query\QueryException: "[Syntax Error] line 0, col 314: Error: Expected end of string, got 'w'" 在 C:\Users\sDev2\xampp\htdocs\bvbp\vendor\doctrine\orm\lib\Doctrine\ORM\Query\QueryException.php

在我的 symfony/doctrine 环境中没有一个标准的 SQL 自定义排序方法(发布在几个 stackoverflow 项目中)。

如果我使用“ASC”参数(这不能解决我的问题):我的 Symfony 应用程序没有问题

示例(正常工作)

  $em = $this->getDoctrine()->getManager();
  $query = $em->createQuery (
     "select w
        FROM MyBundle:Winner w
        WHERE
            w.winnerType IN ('main', 'special', 'normal', 'web')  
.
        ORDER BY w.winnerType ASC  
       ") ;

symfony2 / 学说中使用的语法是什么? 谢谢

【问题讨论】:

  • mysql custom sort的可能重复
  • 虽然您可能使用的是 Symphony2 - Doctrine,但您的问题与 SQL 语法密切相关。 Symphony2 和 Doctrine 标签已被删除,因为它们与问题无关。
  • 可以删除学说和交响乐标签 - 接受您是专家 :-) 我唯一关心的是:stackoverflow 链接到“按 IN 值列表排序”(请参阅​​我的说明)列表正是我正在使用的语法,它似乎适用于其他用户。这就是为什么我认为它与教义/ symfony 有关

标签: mysql sql symfony doctrine


【解决方案1】:

我想以不是 ASC 或 DSC 的自定义顺序(w.winnerType: 'main','special', 'normal', 'web)对查询的搜索结果进行排序,

如果您可以使用下面的查询,它将修复。

$em->createQueryBuilder('w')
                ->select('w')
                ->addSelect("(CASE WHEN w.winnerType like 'main' THEN 0
           WHEN w.winnerType like 'special' THEN 1
           WHEN w.winnerType like 'normal' THEN 2
           WHEN w.winnerType like 'web' THEN 3
           ELSE 999 END) AS HIDDEN fixed_order")
                ->from('WolfBvbpBundle:Winner', 'w')
                ->andWhere('w.winnerType IN (:typesdata)')
                ->setParameters(array(
                    'typesdata' => array('main', 'special', 'normal', 'web')))
                ->orderBy('fixed_order', 'ASC')
            ->getQuery();

请注意,您必须拥有“HIDDEN”。

您也可以使用学说原生查询。

【讨论】:

    【解决方案2】:

    您使用的语法不是有效的 SQL。正确的语法是使用列序号或列名。例如:

    SELECT w.winnerType 
    FROM MyBundle:Winner w
    WHERE
        w.winnerType IN ('main', 'special', 'normal', 'web')  
    ORDER BY CASE w.winnerType 
        WHEN 'main' THEN 1
        WHEN 'special' THEN 2
        WHEN 'normal' THEN 3
        WHEN 'web' THEN 4
        ELSE 999
    END
    

    【讨论】:

    • 感谢 Theo:我在最新版本中简化了示例,现在只使用一个字段 (winnerType),我希望能够为其定义任何序列(不是 ASC 或 DESC)。有了这个,恐怕你的解决方案就行不通了。
    • 解决方案已根据您对帖子所做的编辑进行了更新。您可以修改以获得基于此答案的自定义排序顺序:stackoverflow.com/questions/2175439/mysql-custom-sort
    • 没错,它是一种成本排序,我正在寻找。据我了解,我尝试过的两个“order by”版本应该可以达到这个目的。此外,我尝试了“ORDER BY CASE WHEN .... THEN '1'”方法,它给出了语法错误。同样:我不确定 Symfony/Doctrine sql 解析器是否是问题所在,因为我尝试过的任何标准自定义排序方法都会给出指向语法的特定错误消息
    • 谢谢我已经复制了你的代码我从 symfony 收到以下错误消息:QueryException: [Syntax Error] line 0, col 314: Error: Expected end of string, got 'w' CRITICAL - Uncaught PHP Exception Doctrine\ORM\Query\QueryException: "[Syntax Error] line 0, col 314: Error: Expected end of string, got 'w'" at C:\Users\sDev2\xampp\htdocs\bvbp\vendor\doctrine \orm\lib\Doctrine\ORM\Query\QueryException.php 第 52 行
    • Theo - 我已将代码、您提出的建议以及生成的错误消息添加到我的问题描述中。您是否同意我的假设,即问题与 Symfony2/和 Doctrine 有关。我添加了这两个标签,以获取来自该社区的输入。希望你同意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多