2017-08-03 13 views
-1

感謝您的意見我將從不同的角度嘗試此操作。mysql組合表連接

如何編寫這個查詢來產生這些結果?

CompID CompeteID Casting  Fishing  Total  
     1  1  265.89 425.56  691.45 
     1  9  212.31  84.76  285.92 
     1  7   0.00 285.92  285.92 
     1  8   0.00  44.52  44.52 
    ORDER BY Total DESC 

SELECT cs.CompID, ic.CompeteID 
, MAX(IF(cast.CastType_ID BETWEEN 6 AND 12, cast.Length, 0)) + SUM(IF(cast.CastType_ID < 6, 40 - (cast.Length * 2), 0)) AS 'Casting' 
FROM `comp-setup` cs 
INNER JOIN `input-competitor` ic 
    ON cs.CompID = ic.Comp_ID 
LEFT JOIN `input-casting` cast 
    ON cast.Compete_ID = ic.CompeteID 
GROUP BY ic.CompeteID 

UNION ALL 

SELECT cs.CompID, ic.CompeteID 
, SUM((iw.Weight * ca.Factor) + '1') AS 'Fishing' 
FROM `comp-setup` cs 
INNER JOIN `input-competitor` ic 
    ON cs.CompID = ic.Comp_ID 
LEFT JOIN `input-weighin` iw 
    ON iw.Compete_ID = ic.CompeteID 
INNER JOIN `input-catchpoints` ca 
    ON ca.PointsCatchID = iw.PointsCatch_ID 
GROUP BY ic.CompeteID 

從上面的查詢結果中,我添加了break-line和Fishing header來分隔數據。

CompID CompeteID Casting 
     1  1  265.89 
     1  7    0 
     1  8    0 
     1  9  212.31 
---------------------------------- 
         Fishing 
     1  1  425.56 
     1  7  285.92 
     1  8   44.52 
     1  9   84.76 
+0

添加在評論圖像鏈接我們可以添加它。 –

+3

您正在使用「GROUP BY」,因爲您選擇的是非聚合列,而只能通過「CompeteID」進行聚合。一些示例數據會很好,如果您可以將問題簡化爲_minimal_示例,也會有所幫助。 –

+0

組合總計:https://i.stack.imgur.com/6wxxv.png –

回答

0

這一天讓我解決了這個問題。我今天發現了這個例子,它使我找到了這個解決方案,如果有更好的方法,請發佈。但這就是我需要的!

SELECT Sub1.CompID, Sub1.CompeteID, Sub2.Casting, Sub1.Fishing, Sub2.Casting + Sub1.Fishing AS Total 
FROM 
    (SELECT cs.CompID, ic.CompeteID, SUM((iw.Weight * ca.Factor) + '1') AS Fishing 
FROM `comp-setup` cs 
    INNER JOIN `input-competitor` ic ON cs.CompID = ic.Comp_ID 
    INNER JOIN `input-weighin` iw ON iw.Compete_ID = ic.CompeteID 
    INNER JOIN `input-catchpoints` ca ON ca.PointsCatchID = iw.PointsCatch_ID 
    INNER JOIN `list-grade` gr ON ic.Grade_ID = gr.GradeID 
    INNER JOIN `list-division` ld ON ic.Div_ID = ld.DivID 
    GROUP BY ic.CompeteID) Sub1 

INNER JOIN 

(SELECT cs.CompID, ic.CompeteID, MAX(IF(cast.CastType_ID BETWEEN 6 AND 12, cast.Length, 0)) + SUM(IF(cast.CastType_ID < 6, 40 - (cast.Length * 2), 0)) AS Casting 
FROM `comp-setup` cs 
    INNER JOIN `input-competitor` ic ON cs.CompID = ic.Comp_ID 
    LEFT JOIN `input-casting` cast ON cast.Compete_ID = ic.CompeteID 
    GROUP BY ic.CompeteID) Sub2 

ON Sub1.CompeteID = Sub2.CompeteID 
ORDER BY Total DESC 

這裏是後與我所需要的例子: MYSQL LEFT JOIN with GROUP BY