簡體   English   中英

MySQL 使用 GROUP BY 和 ORDER BY 不同列排序

[英]MySQL ordering with GROUP BY and ORDER BY different column

我正在嘗試從 eav 表(實體屬性值)中獲取唯一的 entId。 但是我還需要按一個屬性從高到低對值進行排序,但是這個屬性並不存在於所有實體中,只有一些實體有這個屬性。 具有此屬性的實體必須位於頂部,然后其值從高到低依次排列。 實際上我已經實現了這一點,但我必須使用總共 1 個主查詢和 2 個嵌套子查詢。 出於性能方面的考慮,現在我正在嘗試查看是否可以僅使用 1 個單個查詢來實現這一點,如果不可能,則使用 1 個主查詢 + 1 個子查詢。

下面是簡化的 sql 和實際應用表。

entId 是實體 ID 的外鍵

attId 是屬性 ID 的外鍵

double 是該實體的值

例如,

House1 (an entity), price (attribute id = 127), 2000 (value) 

House1 (an entity), latitude (attribute id = 137), 1.33 (value) 

一個實體可以有無限數量的不同屬性。 房屋只是實體類別的一個示例,可以有無限數量的不同類別,例如動物、國家、車輛,而每個類別又可以具有無限的屬性。

這是一次嘗試,此查詢在該雙列中獲得了我想要的正確順序,但 entId 不是唯一的,它有重復,如果我添加 DISTINCT,結果將不再按順序排列。

SELECT
        eav.entId, eav2.attId, eav2.`double`
FROM
          eav eav2 JOIN 
          eav ON eav2.entId = eav.entId AND eav2.status = 'active' AND eav.status = 'active' AND eav.catId  = 53 AND eav2.catId  = 53 
where    
         
         
          (
                  
              (
                       eav.attId = 6
                       and
                       (
                                eav.`int` = 110
                       )
              )     
          )
         
         
GROUP BY
          eav.entId, eav2.attId
HAVING
          COUNT(DISTINCT eav.attId)      >= 1
          
ORDER BY 
    (eav2.attId = 127) DESC,
    (eav2.`double`) DESC

摘錄結果,可以看到重復的 entId

在此處輸入圖像描述

這是使用 MAX 聚合的另一種嘗試,這將使我得到唯一的 entId 和一些正確的排序,但一個不正確,因為值為 3000 的頂部結果不應該在頂部,因為該值不屬於我正在排序的屬性(attId=127),但實際上屬於attId = 137。因為兩個聚合MAX是自己排序的,相互獨立。 也許有辦法讓它們與 CONCAT 相互聯系?

 SELECT
        eav.entId, eav2.attId, eav2.`double`, MAX(eav2.attId = 127), MAX(eav2.`double`)
FROM
          eav eav2 JOIN 
          eav ON eav2.entId = eav.entId AND eav2.status = 'active' AND eav.status = 'active' AND eav.catId  = 53 AND eav2.catId  = 53 
where    
         
         
          (
                  
              (
                       eav.attId = 6
                       and
                       (
                                eav.`int` = 110
                       )
              )     
          )
         
         
GROUP BY
          eav.entId
HAVING
          COUNT(DISTINCT eav.attId)      >= 1
          
ORDER BY 
    MAX(eav2.attId = 127) DESC,
    MAX(eav2.`double`) DESC

結果:

在此處輸入圖像描述

我想要的如下:沒有顯示重復的 entId,attId = 127 全部在頂部結果中,然后按其值在雙列中從最高到最低排序。

在此處輸入圖像描述

您似乎想要一個帶有排序的聚合。 像這樣的東西:

SELECT eav.entId,
       MAX(CASE WHEN eav.key = 127 THEN value end) as price,
       MAX(CASE WHEN eav.key = 137 THEN value end) as latitude
FROM eav 
GROUP BY eav.entId
ORDER BY price DESC;

暫無
暫無

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

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