2011-11-15 83 views
0

我有兩個表格,一個用於下載,一個用於上傳。它們幾乎完全相同,但是與其他一些列有所不同。我想爲表格中每個項目的每個日期生成一個統計列表。如何將這兩個查詢合併爲一個?

我使用這兩個查詢,但必須在運行它們後在php中合併數據。我希望在單個查詢中運行它們,它將返回按日期分組的每個行中的兩個查詢中的列。有時沒有任何下載數據,只有上傳數據,並且在我之前的所有嘗試中,如果它無法從兩行中找到日誌數據,它將跳過該行。

我該如何將這兩個查詢合併爲一個,哪裏可以顯示數據,即使它只在一個表中可用?

SELECT DATE(upload_date_added) as upload_date, SUM(upload_size) as upload_traffic, SUM(upload_files) as upload_files 
FROM packages_uploads 
WHERE upload_date_added BETWEEN '2011-10-26' AND '2011-11-16' 
GROUP BY upload_date 
ORDER BY upload_date DESC 


SELECT DATE(download_date_added) as download_date, SUM(download_size) as download_traffic, SUM(download_files) as download_files 
FROM packages_downloads 
WHERE download_date_added BETWEEN '2011-10-26' AND '2011-11-16' 
GROUP BY download_date 
ORDER BY download_date DESC 

我希望得到這樣的結果行:

日期,upload_traffic,upload_files,download_traffic,download_files

所有幫助感激!

回答

0

你所要求的只能用於上傳和下載具有相同添加日期的行。在這種情況下,我想這SQL應該工作:

SELECT 
    DATE(u.upload_date_added) as date, 
    SUM(u.upload_size) as upload_traffic, 
    SUM(u.upload_files) as upload_files, 
    SUM(d.download_size) as download_traffic, 
    SUM(d.download_files) as download_files 
FROM 
    packages_uploads u, packages_downloads d 
WHERE u.upload_date_added = d.download_date_added 
AND u.upload_date_added BETWEEN '2011-10-26' AND '2011-11-16' 
GROUP BY date 
ORDER BY date DESC 
1

你兩個查詢可以被執行,然後用一個額外的字段來標識在不同的行上載和下載沿着UNION cluase組合:

SELECT 
    'Uploads' TransmissionType, 
    DATE(upload_date_added) as TransmissionDate, 
    SUM(upload_size) as TransmissionTraffic, 
    SUM(upload_files) as TransmittedFileCount 
FROM 
    packages_uploads 
WHERE upload_date_added BETWEEN '2011-10-26' AND '2011-11-16' 
GROUP BY upload_date 
ORDER BY upload_date DESC 
UNION 
SELECT 
    'Downloads', 
    DATE(download_date_added), 
    SUM(download_size), 
    SUM(download_files) 
FROM packages_downloads 
WHERE download_date_added BETWEEN '2011-10-26' AND '2011-11-16' 
GROUP BY download_date 
ORDER BY download_date DESC; 

試試看!

0

不知道架構很難給出確切的答案,所以請看下面的概念,而不是直接的答案。

你可以嘗試左連接,如果林不知道存在表的包中,但下面可能深思

SELECT 
    p.id, 
    up.date as upload_date 
    dwn.date as download_date 
FROM 
package p 
LEFT JOIN package_uploads up ON 
    (up.package_id = p.id WHERE up.upload_date = 'etc') 
LEFT JOIN package_downloads dwn ON 
    (dwn.package_id = p.id WHERE up.upload_date = 'etc') 

以上將選擇所有的包,並嘗試加入並在值不加入它將返回null。

0

有很多方法可以做到這一點。您可以使用主鍵和外鍵加入。在情況下,如果你沒有表之間的關係,

可以使用,

  • LEFT JOIN/LEFT OUTER JOIN

返回左表和所有記錄匹配 來自右表的記錄。當沒有匹配時,結果是從 右邊的NULL

  • RIGHT JOIN/RIGHT OUTER JOIN

返回左表右表中的所有記錄和匹配 記錄。當沒有匹配時,從左側的 側結果是NULL

  • FULL OUTER JOIN

返回的所有記錄,當存在左或右表中的記錄匹配。

  • UNION

用於將結果集將兩個或更多SELECT語句。

UNION每個SELECT語句必須具有相同數目的, 列的列還必須具有類似的數據類型中的列,每 語句SELECT也必須按相同的順序。

  • INNER JOIN有兩個表中的匹配值

選擇記錄。這對你的情況有好處。

  • INTERSECT

不支持MySQL。

  • 自然連接

所有列名應匹配。

既然你不需要更新這些,你可以創建一個view加入表,那麼你可以在你的PHP中使用更少的查詢。但視圖無法更新。而且你沒有提到表格之間的關係。正因爲如此,我必須去與UNION

這樣,

CREATE VIEW checkStatus 
AS 
SELECT 
    DATE(upload_date_added) as upload_date, 
    SUM(upload_size) as upload_traffic, 
    SUM(upload_files) as upload_files 
FROM packages_uploads 
WHERE upload_date_added BETWEEN '2011-10-26' AND '2011-11-16' 
GROUP BY upload_date 
ORDER BY upload_date DESC 

UNION 

SELECT 
    DATE(download_date_added) as download_date, 
    SUM(download_size) as download_traffic, 
    SUM(download_files) as download_files 
FROM packages_downloads 
WHERE download_date_added BETWEEN '2011-10-26' AND '2011-11-16' 
GROUP BY download_date 
ORDER BY download_date DESC 

然後任何你要選擇你只需要一條線:

SELECT * FROM checkStatus 

learn more