簡體   English   中英

將mysql子查詢轉換為左聯接

[英]Transform mysql Subquery to Left Join

假設我有下表:

    id  parent
    1   1
    2   1
    3   1
    4   1
    5   2
    6   5
    7   5

我想執行以下查詢:

SELECT id_table.parent,id_table.count_id 
FROM 
    (SELECT count(id) AS count_id,parent FROM item group by parent) AS id_table
     WHERE id_table.count_id = 
         (SELECT max(count_id) AS max_count_id FROM
                      ( SELECT count(id) AS count_id,parent
                            FROM item group by parent ) AS id_table2 )

得到以下結果:

parent  count_id    
1       4

我嘗試轉換查詢以優化性能:

SELECT id_table.parent,id_table.count_id FROM
      (SELECT count(id) AS count_id,parent FROM item GROUP BY parent)
              AS id_table    
LEFT JOIN

      (SELECT count(id) AS count_id,parent FROM item GROUP BY parent )
              AS id_table2    
ON id_table.parent=id_table2.parent AND id_table.count_id<id_table2.count_id

WHERE id_table2.parent IS NULL

但是得到了以下結果,我不想要:

parent  count_id    
1       4
2       1   
5       2

這是我的參考

誰能告訴我我做錯了什么? 問候

您的第二個查詢無法按您期望的方式工作,因為它根本不匹配聯接中的任何記錄。 看:

您正在根據以下條件聲明某個查詢與其本身之間的聯接:

ON id_table.parent=id_table2.parent AND id_table.count_id<id_table2.count_id

這意味着:從第一個查詢中選擇所有記錄(因為它是LEFT聯接),並從第二個查詢中選擇每個記錄,這些記錄具有相同的parent並且count低於第一個查詢。 ¡!

如您所見,這是荒謬的:由於自動聯接的查詢返回以下記錄:

count_id parent
4        1
2        2
2        5

... parent列是實際 PK。 所以。 該對(4,1)沒有x <4的匹配對(x,1)。 (將其余兩對視為同一個。)

那是您的錯誤: MySQL的示例在這里不適用,因為在shop表中,肯定有多個記錄具有相同的article值,這與您的情況不同( parent在自動聯接中具有唯一值)查詢)。

我想到的唯一一個基於聯接的查詢公式是這樣的:

SELECT count_id, parent
FROM (SELECT count(id) AS count_id,parent FROM item GROUP BY parent) query1
INNER JOIN (SELECT MAX(query2.count_id) as max_id FROM (SELECT count(id) AS count_id,parent FROM item GROUP BY parent) query2) queryMax ON query1.count_id=queryMax.max_id;

...但是我懷疑這種復雜性是否會提高您第一種方法的性能。

根據您想要獲得的輸出,我得到了一個更簡單的解決方案。 也許我不明白您的問題,但我會給您一個機會。

為什么要使用您的查詢(有點冗長又雜亂):

SELECT id_table.parent,id_table.count_id 
FROM 
(SELECT count(id) AS count_id,parent FROM item group by parent) AS id_table
 WHERE id_table.count_id = 
     (SELECT max(count_id) AS max_count_id FROM
                  ( SELECT count(id) AS count_id,parent
                        FROM item group by parent ) AS id_table2 )

我用更簡單的查詢完成了相同的結果。

SELECT parent, count(id) as count_id FROM items GROUP BY 1 ORDER BY 2 DESC LIMIT 1

得到以下結果。

parent  count_id    
1       4

你能檢查一下嗎

SELECT parent,count(*) AS parent_count FROM parent group by parent
 ORDER BY parent_count DESC LIMIT 1

希望這可以幫助

暫無
暫無

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

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