سؤال

أريد أن أجمع بين ثلاث طاولات - تاريخ، الرصاص والنقر - في استعلام.

تبدو الجداول مثل هذا:

تاريخ:

|date|

قيادة:

id|time|commission

انقر:

id|time|commission

تاريخ الجدول هو مجرد تخزين التواريخ ويستخدم عند الحصول على التواريخ بدون نقرة أو الرصاص.

لذلك إذا كان لدينا البيانات التالية في الجداول:

تاريخ:

2009-06-01
2009-06-02
2009-06-03

قيادة:

1|2009-06-01|400
2|2009-06-01|300
3|2009-06-03|350

انقر:

1|2009-06-01|1
2|2009-06-03|2
3|2009-06-03|2
4|2009-06-03|0

أرغب في الحصول على تاريخ، عدد النقر، لجنة النقرات النقرات (هناك نقرات لا تعطي عمولة)، عدد العملاء المتوقعين، اللجنة الناتجة عن قيادتها ورسم إجمالي. لذلك مع الجداول أعلاه أود الحصول عليها:

2009-06-01|1|1|2|700|701|
2009-06-02|0|0|0|0|0
2009-06-03|3|4|1|350|354|

لقد حاولت مع الاتحاد التالي:

 SELECT  
    campaign_id, 
    commission_date,  
    SUM( click_commission ) AS click_commission,
    click,
    SUM( lead_commission ) AS lead_commission ,  
    lead,
    SUM( total_commission ) as total_commission
    FROM(
        SELECT  
            click.campaign_id AS campaign_id, 
            DATE( click.time ) AS commission_date, 
            click.commission AS click_commission, 
            (SELECT count(click.id) from click GROUP BY date(click.time)) as click,
            0 as lead_commission,
            0 as lead,
            click.commission AS total_commission
        FROM click
        UNION ALL
        SELECT 
            lead.campaign_id AS campaign_id, 
            DATE( lead.time ) AS commission_date, 
            0 as click_commission,
            0 as click,
            lead.commission AS lead_commission, 
            lead.id as lead,
            lead.commission AS total_commission
        FROM lead
        UNION ALL
        SELECT 
            0 AS campaign_id, 
            date.date AS commission_date, 
            0 AS click_commission, 
            0 as click,
            0 AS lead_commission, 
            0 as lead,
            0 AS total_commission
        FROM date 
    ) AS foo 
    WHERE commission_date BETWEEN '2009-06-01' AND '2009-07-25' 
    GROUP BY  commission_date 
    ORDER BY commission_date LIMIT 0, 10

ولكن هذا لا يعمل على حساب عدد النقرات ويؤدي التعليمات البرمجية أعلاه يمنح الكود المبلغ الصحيح من النقرات بوت 0 على جميع العملاء المتوقعين. إذا قمت بنقل الرمز حوله ووضعه من جدول الرصاص، أحصل على Lefines Right Bot 0 على جميع النقرات. لم أتمكن من إيجاد طريقة للحصول على كل من التهم من الاستعلام.

لذلك حاولت الانضمام اليسرى بدلا من ذلك:

SELECT
    date.date as date, 
    count( DISTINCT click.id ) AS clicks, 
    sum(click.commission) AS click_commission, 
    count( lead.id ) AS leads, 
    sum(lead.commission) AS lead_commission
FROM date
LEFT JOIN click ON ( date.date = date( click.time ) )
LEFT JOIN lead ON ( date.date = date( lead.time ) )
GROUP BY date.date
LIMIT 0 , 30 

المشكلة في هذا الاستعلام هو إذا كان هناك أكثر من نقرات أو يؤدي في تاريخ، وسوف ترجع القيمة المتوقعة * 2. لذلك في 2009-06-01 سيعود 1400 بدلا من ذلك بدلا من 700 من المتوقع للجنة الرصاص.

أود حقا التمسك بالاتحاد إن أمكن، لكنني لم أجد وسيلة للحصول على كلا الطرفين.

(هذه متابعة هذه سؤال سابق، ولكن منذ أن لم أطلب العد في ذلك نشرت سؤالا جديدا.)

هل كانت مفيدة؟

المحلول

SELECT  date,
        COALESCE(lcomm, 0), COALESCE(lcnt, 0),
        COALESCE(ccomm, 0), COALESCE(ccnt, 0),
        COALESCE(ccomm, 0) + COALESCE(lcomm, 0),
        COALESCE(ccnt, 0) + COALESCE(lcnt, 0)
LEFT JOIN
        (
        SELECT  date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
        FROM    leads
        GROUP BY
                date
        ) l
ON      l.date = d.date
LEFT JOIN
        (
        SELECT  date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
        FROM    clicks
        GROUP BY
                date
        ) с
ON      c.date = d.date
FROM    date d

نصائح أخرى

الرمز الذي استخدمته، بنيت من الاقتراح من Quassnoi:

SELECT  date,
        COALESCE(ccomm, 0) AS click_commission, COALESCE(ccnt, 0) AS click_count,
        COALESCE(lcomm, 0) AS lead_commision, COALESCE(lcnt, 0) AS lead_count,
        COALESCE(ccomm, 0) + COALESCE(lcomm, 0) as total_commission
FROM    date d
LEFT JOIN
        (
        SELECT  DATE(time) AS lead_date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
        FROM    lead
        GROUP BY
                lead_date
        ) l
ON     lead_date = date
LEFT JOIN
        (
        SELECT  DATE(time) AS click_date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
        FROM    click
        GROUP BY
                click_date
        ) с
ON      click_date =  date
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top