2014-09-02 38 views
1

我有兩個獨立工作的MySQL查詢,我希望將它們組合在一起,以便返回三個值。將兩個類似的查詢結合在一起

查詢1個檢查多少帳戶已被刪除:

SELECT 
    COUNT(1) AS deleted_count, 
    SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date 
FROM 
    exit_reasons e 
WHERE 
    e.timestamp>='$sixmonths' 
GROUP BY 
    WEEKOFYEAR(e.timestamp) 
ORDER BY 
    display_date ASC 
LIMIT 26 

這返回的日期,誰在這一週中刪除

查詢2個檢查多少這些都隨後再次報名人數:

SELECT 
    COUNT(1) AS date_count, 
    SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date 
FROM 
    exit_reasons e 
LEFT JOIN 
    companies c on e.email=c.email 
WHERE 
    e.timestamp>='$sixmonths' AND c.email IS NOT NULL 
GROUP BY 
    WEEKOFYEAR(e.timestamp) 
ORDER BY 
    display_date ASC 
LIMIT 26 

這會返回一個日期和星期刪除的號碼誰現在有一個新的帳戶

我想它返回一個日期,然後數刪除,並在一個查詢再結合數,所以我嘗試:

SELECT 
    COUNT(1) AS date_count, 
    SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date, 
    date_count as rejoined_count from 
     (SELECT 
      COUNT(1) AS date_count, 
      SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date 
     FROM 
      exit_reasons e2 
     LEFT JOIN 
      companies c on e.email=c.email 
     LEFT JOIN 
      companies_users cu on e.email=cu.email 
     WHERE 
      e2.timestamp>='$sixmonths' AND c.email IS NOT NULL 
     GROUP BY 
      WEEKOFYEAR(e.timestamp) 
     ORDER BY 
      display_date ASC 
     LIMIT 26) 
FROM 
    exit_reasons e 
WHERE 
    e.timestamp>='$sixmonths' 
GROUP BY 
    WEEKOFYEAR(e.timestamp) 
ORDER BY 
    display_date ASC 
LIMIT 26 

,但我得到一個語法錯誤 - 我怎麼可以將這些查詢組合在一起成爲一個查詢?

回答

1

通過使用聚合函數以及一些條件邏輯(如CASE表達式),您應該能夠將兩個查詢合併爲一個查詢:

SELECT 
    COUNT(1) AS deleted_count, 
    SUM(CASE WHEN c.email IS NOT NULL THEN 1 ELSE 0 END) as date_count, 
    SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date 
FROM exit_reasons e 
LEFT JOIN companies c 
    on e.email=c.email 
WHERE e.timestamp>='$sixmonths' 
GROUP BY WEEKOFYEAR(e.timestamp) 
ORDER BY display_date ASC 
LIMIT 26; 

See Demo。如果將c.email IS NOT NULL移動到SUM(CASE..中,則可以檢查第二個查詢,該查詢允許您獲取總數不爲空的行。

+0

工作過,感謝 – bhttoan 2014-09-03 18:17:10

0

我認爲下面會做你想要什麼:

SELECT COUNT(*) AS deleted_count, 
     COUNT(c.email) as date_count, 
     SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date 
FROM exit_reasons e LEFT JOIN 
    companies c 
    on e.email = c.email 
WHERE e.timestamp >= '$sixmonths' 
GROUP BY WEEKOFYEAR(e.timestamp) 
ORDER BY display_date ASC 
LIMIT 26; 

倘若有人可以註冊多個具有相同電子郵件一次,你應該改變count()使用distinct

COUNT(DISTINCT e.email) as deleted_count, 
COUNT(DISTINCT c.email) as date_count 
+0

這個搜索郵件是否爲空/現在存在?在date_count之後也缺少一個逗號,但編輯過短... – bhttoan 2014-09-02 15:48:09

+0

@bhttoan。 。 。我不知道「不是空/現在」是什麼意思。這應該在輸出中有三列與原始查詢相對應。 – 2014-09-02 16:07:12

+0

「不爲空」是檢查電子郵件現在是否存在於第二張表中 - 沒有它我怎麼才能讓那些已經重新加入的人? – bhttoan 2014-09-02 16:29:16