【问题标题】:Unique Left Join Gives Skewed Results唯一的左连接会产生倾斜的结果
【发布时间】:2014-12-19 11:30:29
【问题描述】:

我很困惑!我有 3 个表格,分别为我提供了我正在寻找的结果。当我加入它们(尝试加入、联合、左加入、子查询)时,我得到了倾斜的结果。

表 1:

SELECT DISTINCT JB.job_id, AR.job_id as jid, SUM(AR.ar_payment_amount) AS sum,
JB.marketing_campaign FROM job_tbl JB LEFT JOIN ar_payment_tbl AR ON JB.job_id = 
AR.job_id WHERE JB.marketing_campaign != '' AND FROM_UNIXTIME(AR.ar_payment_date,'%Y') = 
YEAR(NOW()) GROUP BY JB.marketing_campaign ORDER BY sum DESC LIMIT 10

这给了我正在寻找的结果(仅显示此示例的一个结果)

[job_id] => 551
[jid] => 551
[sum] => 124440.97024536133
[marketing_campaign] => Roto Rooter

表 2:

SELECT DISTINCT JB.job_id, AP.job_id, SUM(price) AS price, AP.vendor FROM job_tbl JB 
LEFT JOIN ap_tbl AP ON JB.job_id = AP.job_id WHERE AP.marked_as_paid = 1 AND 
AP.activity = 'Commission' AND FROM_UNIXTIME(AP.payment_date,'%Y') = YEAR(NOW()) GROUP
BY vendor ORDER BY price DESC LIMIT 10

这给了我正在寻找的结果...

        [job_id] => 551
        [price] => 5700
        [vendor] => 436

现在当我加入他们时,我会得到不同的结果

SELECT DISTINCT JB.job_id, AR.job_id as arid, AP.job_id as apid, 
SUM(AR.ar_payment_amount) AS sum, SUM(AP.price) AS price, JB.marketing_campaign FROM
job_tbl JB LEFT JOIN ap_tbl AP ON JB.job_id = AP.job_id AND AP.marked_as_paid = 1 AND 
AP.activity = 'Commission' LEFT JOIN ar_payment_tbl AR ON JB.job_id = AR.job_id  AND 
FROM_UNIXTIME(AR.ar_payment_date,'%Y') = YEAR(NOW()) WHERE AP.price != '' AND 
AR.ar_payment_amount != '' AND JB.marketing_campaign != '' GROUP BY 
JB.marketing_campaign ORDER BY sum DESC LIMIT 10

这是我得到的结果

        [job_id] => 551
        [arid] => 551
        [apid] => 551
        [sum] => 130507.02011108398
        [price] => 8200
        [marketing_campaign] => Roto Rooter

结果应该是这样的

        [job_id] => 551
        [arid] => 551
        [apid] => 551
        [sum] => 124440.97024536133
        [price] => 5700
        [marketing_campaign] => Roto Rooter

任何帮助都将不胜感激,这个项目于上周五到期! ;-)

【问题讨论】:

    标签: mysql join sum left-join union


    【解决方案1】:

    试试这个 - 我认为 JOIN 条件和 GROUP BY 存在问题:

    SELECT 
        JB.job_id, 
        AR.job_id as arid, 
        AP.job_id as apid, 
        JB.marketing_campaign,
        SUM(AR.ar_payment_amount) AS `sum`, 
        SUM(AP.price) AS price
    
    FROM job_tbl JB 
    LEFT JOIN ap_tbl AP ON JB.job_id = AP.job_id 
    LEFT JOIN ar_payment_tbl AR ON JB.job_id = AR.job_id
    WHERE
        AP.marked_as_paid = 1 
        AND AP.activity = 'Commission'   
        AND FROM_UNIXTIME(AR.ar_payment_date,'%Y') = YEAR(NOW()) 
        AND AP.price != '' 
        AND AR.ar_payment_amount != '' 
        AND JB.marketing_campaign != '' 
    GROUP BY 1,2,3,4
    ORDER BY `sum` DESC LIMIT 10
    

    【讨论】:

    • 谢谢 Benni,如果我按原样使用它,它不会相加并显示每个 job_id 并且如果我将它们全部加在一起,它的总和是正确的。如果我删除 JB.job_id 它会给出与以前相同的答案,但会正确分组。 (也应该是 GROUP BY)还有其他想法吗?
    • Same...给了我所有的 job_id,而不是按 marketing_campaign 分组。
    • 请为测试用例提供一些CREATE TABLE...INSERT... 语句。
    • 抱歉耽搁了……我必须访问这些表。我在哪里发送或发布转储?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多