sql - 使用查询构建器根据条件对表中的同一列进行排序,具有不同的排序顺序
问题描述
我有一个表,我需要在该表上运行 select 语句时检查一个条件,根据我需要更改排序条件的条件。如何使用查询生成器(Doctrine)来实现这一点。示例:表名 -> 产品
<table>
<tr>
<th>pid</th>
<th>Lastname</th>
<th>instock</th>
<th>laststock</th>
<th>price</th>
</tr>
<tr>
<td>two</td>
<td>234</td>
<td>1</td>
<td>1</td>
<td>101</td>
</tr>
<tr>
<td>three</td>
<td>345</td>
<td>0</td>
<td>1</td>
<td>102</td>
</tr>
<tr>
<td>four</td>
<td>567</td>
<td>2</td>
<td>1</td>
<td>103</td>
</tr>
<tr>
<td>five</td>
<td>678</td>
<td>0</td>
<td>0</td>
<td>104</td>
</tr>
<tr>
<td>one</td>
<td>123</td>
<td>3</td>
<td>0</td>
<td>100</td>
</tr>
</table>
所以在这个表中,我需要首先检查 instock 值,如果它大于零,我需要按 DESC 顺序(instock 列)对其进行排序。否则我需要在 ASC 订单中订购(库存列)。如何使用查询生成器执行此操作?
我需要这样的输出
<table style="width: 100%;">
<tbody>
<tr>
<th>pid</th>
<th>Lastname</th>
<th>instock</th>
<th>laststock</th>
<th>price</th>
</tr>
<tr>
<td>one</td>
<td>123</td>
<td>3</td>
<td>0</td>
<td>100</td>
</tr>
<tr>
<td>four</td>
<td>567</td>
<td>2</td>
<td>1</td>
<td>103</td>
</tr>
<tr>
<td>two</td>
<td>234</td>
<td>1</td>
<td>1</td>
<td>101</td>
</tr>
<tr>
<td>three</td>
<td>345</td>
<td>0</td>
<td>1</td>
<td>102</td>
</tr>
<tr>
<td>five</td>
<td>678</td>
<td>0</td>
<td>0</td>
<td>104</td>
</tr>
</tbody>
</table>
我尝试的是
$query->addOrderBy(($query->expr()->neq('variant.instock', 0)), 'DESC')
->addOrderBy(($query->expr()->eq('variant.instock', 0)) , 'ASC');
最终这会像下面这样调用 SQL 查询
SELECT * FROM product ORDER BY instock <> 0 DESC, instock = 0 ASC
并给出这样的输出
<table style="width: 100%;">
<tbody>
<tr>
<th>pid</th>
<th>Lastname</th>
<th>instock</th>
<th>laststock</th>
<th>price</th>
</tr>
<tr>
<td>two</td>
<td>234</td>
<td>1</td>
<td>1</td>
<td>101</td>
</tr>
<tr>
<td>four</td>
<td>567</td>
<td>2</td>
<td>1</td>
<td>103</td>
</tr>
<tr>
<td>one</td>
<td>123</td>
<td>3</td>
<td>0</td>
<td>100</td>
</tr>
<tr>
<td>three</td>
<td>345</td>
<td>0</td>
<td>1</td>
<td>102</td>
</tr>
<tr>
<td>five</td>
<td>678</td>
<td>0</td>
<td>0</td>
<td>104</td>
</tr>
</tbody>
</table>
解决方案
您的 Sql 代码可以如下所示
SELECT * FROM product ORDER BY case when instock = 0 then 0 else 1 end
推荐阅读
- java - 与 Azure AD 集成以将用户添加到组的最佳方式
- python - 出现以下错误,无法弄清楚
- amazon-web-services - 查看当前用户登录的时间
- python - Tkinter 树视图列扩展到超过框架宽度
- discord.py - 计数命令 (discord.py)
- dataframe - 使用 Repartition 和 Coalesce 将 Dataframe 输出到 CSV 文件
- django - Django 休息框架和前端
- reactjs - 是否可以在两个一起运行的反应应用程序之间共享环境变量?
- java - 查找堆栈java的索引
- html - 如何解决 thymeleaf css not found 错误?