Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql orderBy多个列-原则QueryBuilder_Sql_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Sql orderBy多个列-原则QueryBuilder

Sql orderBy多个列-原则QueryBuilder,sql,symfony,doctrine-orm,doctrine,Sql,Symfony,Doctrine Orm,Doctrine,我想在多个列上使用orderBY,但它们的行为应该类似于一个列。 这张桌子看起来像这样: col1 | col2 5 | 2 | | 3 7 | | 1 | 1 col1 | col2 | 1 | 1 2 | | 3 5 | 7 | 结果应该是这样的: col1 | col2 5 | 2 | | 3 7 | | 1 | 1 col1 | col2

我想在多个列上使用orderBY,但它们的行为应该类似于一个列。 这张桌子看起来像这样:

col1 | col2
5    |
2    |
     | 3
7    |
     | 1
     | 1
col1 | col2
     | 1
     | 1
2    |
     | 3
5    |
7    |
结果应该是这样的:

col1 | col2
5    |
2    |
     | 3
7    |
     | 1
     | 1
col1 | col2
     | 1
     | 1
2    |
     | 3
5    |
7    |
如果我们使用原始SQL,就会有一些方法,比如使用
COALESCE

但是,在理论QueryBuilder中如何实现这一点呢

编辑: 我试过这样的orderBy:

qb->orderBy("COALESCE(col1, col2)", "DESC");
像这样

qb->add("orderBy", "COALESCE(col1, col2) DESC");
但两次我都被抛出以下错误:

[Syntax Error] line 0, col 700: Error: Expected end of string, got '(' 

尝试在select语句中添加order列,然后按其排序

$qb = $em->createQueryBuilder();
$qb
    ->select('entity', 'COALESCE(col1, col2) as orderCol')
    ->from('Namespace/Entity', 'entity')
    ->orderBy('orderCol', 'DESC')

也许从图书馆使用会有帮助。使用composer安装它(如果需要,也可以只复制一个文件),然后

在config.yml中注册函数

并构建一个查询

$qb = $em->createQueryBuilder();
$qb
    ->select('entity', 'IF(col1, col1, col2) as orderCol')
    ->from('Namespace/Entity', 'entity')
    ->orderBy('orderCol', 'DESC')


另一个选择是使用纯mysql并将结果映射到实体。

作为一个好的解决方案-为实现方法COALESCE创建自定义条令函数。您尝试过COALESCE吗?它包含在语言中grammar@Lolo谢谢你的评论。我编辑了上面的问题。也许我用错了?@ZhukV对不起,但我可能不适合这样做。你有关于这方面的进一步文件/信息吗?似乎不可能:谢谢你的回复。我明天会测试这个,并给你反馈。但是我真的不想使用原始的mysql查询。你知道什么更有效率吗。如果还是合并?我可以确认@forgottenbas的解决方案会像我几天前遇到的类似情况一样有效。作为补充,我还将包含
HIDDEN
关键字以保留干净的结果集结构,但这绝不是强制性的:
COALESCE(col1,col2)作为隐藏顺序col
@Robin不知道哪个更快,通常这不是查询中最慢的部分,但是@Jovan Perovic中的一些信息在哪里:谢谢隐藏!如果将其用作Symfony 2.8中EntityType字段的“query\u builder”参数,则必须使用此参数!