簡體   English   中英

排序,分組和過濾SQL結果集

[英]Ordering, grouping and filtering SQL result sets

我在數據庫中有許多“容器”,每個“容器”包含零個或多個項目。 每個項目都有一個名稱,分數,表示該項目已添加到容器的時間戳以及容器ID上的外鍵。

我想獲取所有頂部得分為5或更高的容器(這意味着不返回空容器)。 由於容器在這種情況下就像堆棧一樣,因此具有“附加時間”最高的項目被視為“頂部”項目。

目前,我正在使用以下SQL:

SELECT * FROM (
  SELECT name, container_id, score
  FROM items
  ORDER BY added_time DESC
) AS temptbl
GROUP BY container_id
HAVING score >= 5

這似乎給了我想要的結果,但是當項目數開始增加時,它的運行速度非常慢-在8000個容器上運行查詢,而在10000個項目上運行查詢,在MySQL控制台上將近6秒鍾,這太慢了。 我做的事情顯然效率低下嗎?

也許這就是您想要的:

SELECT name, container_id, score
FROM items AS tb1
RIGHT JOIN (SELECT container_id, Max(added_time) as added_time 
    FROM items GROUP BY tablename) as tb2 on 
    tb1.container_id = tb2.container_id AND tb1.added_time = tb2.added_time
WHERE score >= 5

請嘗試以下任一方法。 它依賴於(container_id,add_id)是唯一的。

select *
  from (select container_id, max(added_time) as added_time
          from items
         group by container_id
       ) as topitems 
  join items on(topitems.container_id = items.container_id and 
                topitems.added_time   = items.added_time)
 where items.score >= 5;


select *
  from items a
 where score >= 5
   and (added_time) = (select max(b.added_time)
                         from items b
                        where a.container_id = b.container_id);

事實證明,內部選擇具有LEFT JOIN,這會導致速度降低-刪除操作將查詢時間減少到0.01s。 這意味着會丟失聯接所帶來的信息,但是可以在以后進行填充(返回的最終行數很小,因此不必為每個行都運行一個查詢來復制LEFT的影響而已)加入)。

暫無
暫無

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

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