簡體   English   中英

從沒有 UID 的表創建 SQL 視圖

[英]Creating a SQL view from tables without UIDs

我有兩張桌子:

  • match_rating,其中包含有關球隊在比賽中表現的數據。 每個 matchId 自然有兩個元組(因為每場比賽有兩支球隊)。 PK是matchId,teamId。
  • 事件,其中包含有關比賽期間事件的信息。 PK 是一個自動遞增的 UID,它還包含外鍵 match_id 和 subject_team_id。

現在我想創建一個新視圖,它計算某些事件在比賽中發生的次數,對於每個團隊,具有如下字段:

數據庫表字段

但對於我來說,我無法回避這樣一個事實:1) match_rating 表中的每場比賽都有兩個元組,以及 2) 在 match_id 上查詢事件表會返回兩支球隊的事件。

我得到的最接近的是這樣的:

SELECT SUM(
        CASE 
            WHEN evt.event_type_id = 101 THEN 1
            WHEN evt.event_type_id = 111 THEN 1
            WHEN evt.event_type_id = 121 THEN 1
            [etc]
        END    
    ) AS 'mid_chances',
    SUM(
        CASE 
            WHEN evt.event_type_id = 103 THEN 1
            WHEN evt.event_type_id = 113 THEN 1
            WHEN evt.event_type_id = 123 THEN 1
            [etc]
        END    
    ) AS 'right_chances',
    mr.tactic,
    mr.tactic_skill,
    mr.bp,
    evt.match_id,
    evt.subject_team_id    
FROM event evt
JOIN match_rating mr
     ON evt.match_id = mr.match_id
WHERE   evt.event_type_id BETWEEN 100 AND 104 OR 
        evt.event_type_id BETWEEN 110 AND 114 OR 
        evt.event_type_id BETWEEN 120 AND 124 OR 
        [etc]
GROUP BY evt.match_id  
ORDER BY `right_chances`  DESC

但是,這仍然會對事件進行兩次計數,報告 2 個事件,其中只有 1 個事件、6 個事件有 3 個事件,依此類推。 我也嘗試過對 team_id 進行分組(GROUP BY evt.match_id AND team_id),但它只返回 2 行,所有事件都被計算在內。

我希望我已經把我的問題說清楚了,很明顯我真的需要一兩個好的提示。

為清楚起見而編輯(抱歉): match_rating 表的示例數據: 在此處輸入圖像描述

事件表的示例數據: 在此處輸入圖像描述

我希望看到的結果是這樣的: 在此處輸入圖像描述

也就是說,每場比賽有兩個元組,每個團隊一個,總結了該團隊的事件類型。 非常感謝您對此進行調查!

評論/反饋后更新

好的..只是為了確認,你想要的是

  • output 的每一行代表一場比賽中的一支球隊
  • 其他值(除了 match_id 和 team_id)是跨多行的總和或其他聚合?

如果是這樣,那么我相信您應該按 match_id 和 team_id 進行 GROUP BY。 這應該會導致生成正確的行數(每個 match_id/team_id 組合一個)。 您在問題中說您已經嘗試過 - 我建議對其進行審查(可能還要考慮以下內容)。

對於您的數據,“事件”表似乎也有一個指示 team_id 的字段。 為確保您只獲得相關團隊的活動,我建議您在 match_rating 和 event 之間加入兩個字段,例如,

FROM event evt
JOIN match_rating mr
     ON evt.match_id = mr.match_id
     AND evt.subject_team_id = mr.team_id

以前的答案 - 不回答問題(根據后來的評論)

只是確認 - 問題是當你運行它時,對於每場比賽,它返回 2 行 - 每個團隊一個 - 但你想只對兩個團隊進行處理作為一行?

因此,您可以做一些事情(例如,使用 Team1 評分和 Team2 評分將比賽評分表自連接到自身)。

或者,您可以修改您的 FROM 以兩次加入 match_rating - 其中第一個具有兩個團隊的較低 ID,例如,

FROM event evt
JOIN match_rating mr_team1
     ON evt.match_id = mr_team1.match_id
JOIN match_rating mr_team2
     ON evt.match_id = mr_team2.match_id
     AND mr_team1.match_id < mr_team2.match_id

當然,您的處理需要進行修改以考慮到這一點,例如,一行代表一場比賽,並且您有一組 team1 的數據和 team2 的類似數據。 然后,我假設,比較 team1 列和 team2 列的數據以獲得某種評級等(例如,Team1 獲勝的機會等)。

暫無
暫無

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

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