簡體   English   中英

SQL count(distinct) 在這種情況下如何工作?

[英]How does SQL count(distinct) work in this case?

我試圖找到德國對陣波蘭的比賽編號。 這是來自https://www.w3resource.com/sql-exercises/soccer-database-exercise/sql-subqueries-exercise-soccer-database-4.php 有兩個表:match_details 和 football_country。 我不明白在這種情況下 count(distinct) 是如何工作的。 有人可以澄清一下嗎? 謝謝!

SELECT match_no 
FROM match_details 
WHERE team_id = (
    SELECT country_id 
    FROM soccer_country 
    WHERE country_name = 'Germany') 
  OR team_id = (
    SELECT country_id 
    FROM soccer_country 
    WHERE country_name = 'Poland') 
GROUP BY match_no 
HAVING COUNT(DISTINCT team_id) = 2;

正如 Lamak 所提到的,查詢的考慮是多么丑陋,但處理查詢的方法有很多。

如前所述,計算 (Distinct team_id) 確保只有 2 個獨特的團隊。 如果存在笛卡爾結果,您可能會重復多行,顯示兩個團隊的多個實例。 所以 TEAM_ID 上的不同計數消除了這一點。

現在,就是說,我見過的其他“團隊”查詢數據結構有一個比賽記錄和一個每支球隊參加比賽的列。 從長遠來看,這更容易,但仍然是一個相對容易的查詢。

稍微分解一下查詢,並考慮一個大規模的數據集(並不是說這個,或者任何類型的甚至是職業聯賽都會有如此大的記錄計數,從而使用 sql 引擎延遲)。

您的第一個標准是與德國的比賽。 所以讓我們從那開始。

SELECT 
      md1.match_no 
   FROM 
      match_details md1
         JOIN soccer_country sc1
            on md1.team_id = sc1.country_id
            AND sc1.country_name = 'Germany'

那么,如果德國甚至不是雙方比賽的一部分,為什么還要查看任何其他記錄/比賽。 其中這本身將從 51 個匹配的樣本數據中返回 6 個匹配。 所以現在,您需要做的就是再次將這些比賽加入到比賽詳細信息表中,但第二支球隊也是波蘭

SELECT 
      md1.match_no 
   FROM 
      match_details md1
         JOIN soccer_country sc1
            on md1.team_id = sc1.country_id
            AND sc1.country_name = 'Germany'
         -- joining again for the same match Germany was already qualified
         JOIN match_details md2
            on md1.match_no = md2.match_no
            -- but we want the OTHER team record since Germany was first team
            and md1.team_id != md2.team_id
            -- and on to the second country table based on the SECOND team ID
            JOIN soccer_country sc2
               on md2.team_id = sc2.country_id
               -- and the second team was Poland
               AND sc2.country_name = 'Poland'

是的,可能是一個更長的查詢,但是通過消除 45 個其他匹配項(再次考慮一個大型數據庫),您已經將大量數據保存到一個非常有限的集合中。 而現在只整理那些德國/波蘭。 沒有聚合、計數、不同,只是直接連接。

反饋

讓我們來看看一些 BAD 示例數據......正如所有程序員都知道的那樣,沒有這樣的事情(NOT)。 總之,讓我們來看看這幾場比賽。

Match    Team ID    blah
52       Poland     Just put the names here for simplistic purposes
52       Poland
53       Germany
53       Germany

如果您要在沒有 DISTINCT Teams 的情況下運行查詢,那么第 52 場和第 53 場比賽都會出現......因為波蘭是一支球隊,在第 52 場比賽中出現 2 次,同樣,德國在第 53 場比賽中出現 2 次。通過執行 DISTINCT Team,您可以看到,對於每場比賽,只有 1 支球隊被退回,因此被排除在外。 這有幫助嗎? 同樣,沒有壞數據之類的東西:)

還有超過 2 個團隊創建的另一場示例比賽

Match    Team ID    
54       France     
54       Poland
54       England
55       Hungary
56       Austria

在這些匹配中的每一個中,都將返回 NONE。 第 54 場比賽有 3 支不同的球隊,第 55 場和第 56 場比賽只有單人參賽,因此沒有對手可對抗。

第二次反饋

澄清查詢。 如果您查看僅針對德國的簡短查詢,則“md1”的別名實例已經位於德國匹配的任何給定記錄中。 所以第二次加入“md2”,我只關心同一個匹配,所以我可以加入同一個match_no。 但是,在“md2”別名中,“.=" 表示不等於。 , = 邏輯非。 所以加入是說從 MD1,加入到相同匹配 id 上的 MD2 別名。 然而。 只在團隊不一樣的地方給我。 所以第一個實例擁有德國的團隊 ID(已經合格),因此給了我第二個團隊 ID。 因此,現在我可以使用輔助 (md2) 實例團隊 ID 加入該國家/地區以確認僅適用於波蘭。

現在這是否為您澄清了一些事情?

暫無
暫無

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

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