Sql orderBy多个列-原则QueryBuilder
我想在多个列上使用orderBY,但它们的行为应该类似于一个列。 这张桌子看起来像这样: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
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”参数,则必须使用此参数!