簡體   English   中英

使用querybuilder根據條件以不同排序順序對表中的同一列進行排序

[英]Ordering-by the same column in a table with different sort order based on a condition using querybuilder

我有一張桌子,我需要根據條件更改順序條件,在此表上運行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>

因此,在此表中,我需要首先檢查庫存值是否大於零,我需要按DESC順序(庫存列)進行訂購。 否則我需要訂購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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM