Mysql

mysql查詢性能…必須是更好的方法

  • December 30, 2021

我現在有一個疑問,因為沒有更好的詞,很爛。我正在尋找有關編寫此查詢的其他方法的幫助。這是詳細資訊。

我已經建立了一個臨時表,其中包含以下列:

  • AssignmentSubType
  • AssignmentValue
  • OwnerUsergroupID
  • AssociatedObjectID

我想做的基本要點是找到AssociatedObjectID具有相同AssignmentSubType,AssignmentValueOwnerUsergroupID. AssignmentSubType這是因為如果我有“重複”(相同的AssignmentValue、 和OwnerUsergroupID) ,有大量的 SQL 真的不需要執行。一旦我得到了我的重複列表,我就在其中一個重複上執行下一組 SQL 內容,當我從中獲得資訊時,我將其餘的重複加入最終結果集。

範例表數據:

AssignmentSubType | AssignmentValue | OwnerUsergroupID | AssociatedObjectID
retailer          | Dicks           | 1                | 5
retailer          | Dicks           | 1                | 7
retailer          | Dicks           | 1                | 9

在此範例中,我只想對 associatedobjecid = 5 進行計算,因為 7 和 9 將完全相同,然後在“結束”處重新加入 7 和 9

我有以下查詢有效,但效率很低

SELECT firstObject, f2.AssociatedObjectID 
           FROM ( 
               SELECT firstObject, dupAss AS dups 
               FROM ( 
                   SELECT min(AssociatedObjectID) AS firstObject, group_concat(concat('-',AssociatedObjectID,'-')) AS dupAss 
                   FROM ( 
                       SELECT * FROM tableFromAbove 
                   ) innerRes GROUP BY AssignmentSubType, AssignmentValue, OwnerUsergroupID 
               ) outR 
           ) outR2 
           LEFT JOIN tableFromAbove f2 
               ON outR2.dups LIKE concat('%-',f2.AssociatedObjectID,'-%') ORDER BY firstObject

這個查詢會給我一個結果集,如下所示

firstObject | AssociatedObjectID
5           | 7
5           | 9

就像我在這篇文章前面所說的那樣……然後我使用這個結果集來加入來自關聯對象 ID = 5 的其餘查詢的結果。關於如何重組它以使其更有效的任何想法?

這是喬希。嘗試以下

SELECT  b.minID, a.AssociatedObjectID
FROM    tableFromAbove a
       LEFT JOIN
       (
           SELECT AssociatedObjectID, AssignmentSubType, AssignmentValue, OwnerUsergroupID, MIN(AssociatedObjectID) minID
           FROM tableFromAbove 
           GROUP BY AssignmentSubType, AssignmentValue, OwnerUsergroupID
       ) b
           ON a.AssignmentSubType = b.AssignmentSubType AND a.AssignmentValue = b.AssignmentValue AND a.OwnerUsergroupID = b.OwnerUsergroupID
           WHERE minID <> a.`AssociatedObjectID`;

這是一個簡化的查詢

首先獲取第min AssociatedObjectID一個對象,然後獲取其他對象。

select 
 t3.AssociatedObjectID first_object,
 t.AssociatedObjectID
from test t
   join (
       select 
         t2.AssignmentSubType,
         t2.AssignmentValue,
         t2.OwnerUsergroupID,
         min(t2.AssociatedObjectID) as AssociatedObjectID
       from test t2
       group by
         t2.AssignmentSubType,
         t2.AssignmentValue,
         t2.OwnerUsergroupID
   ) t3 
   on t.AssignmentSubType = t3.AssignmentSubType
   and t.AssignmentValue  = t3.AssignmentValue
   and t.OwnerUsergroupID  = t3.OwnerUsergroupID
   and t.AssociatedObjectID  != t3.AssociatedObjectID;

引用自:https://dba.stackexchange.com/questions/204439