2011-11-15 18 views
0

私はダウンロード用とアップロード用の2つのテーブルを持っています。それらはほとんど同じですが、それらとは異なるいくつかの列があります。私はテーブル内の各項目の日付ごとの統計情報のリストを生成したいと思います。これらの2つのクエリを1つにするにはどうすればよいですか?

私はこれらの2つのクエリを使用しますが、それらを実行した後にphpでデータをマージする必要があります。私は代わりにそれらを日付でグループ化された各行の両方のクエリから列を返す単一のクエリで実行したいと思います。場合によってはダウンロードデータがなく、データのみをアップロードすることがあり、以前のすべての試みで、両方の行からログデータが見つからない場合は行をスキップします。

これらの2つのクエリを1つにマージすると、テーブルのいずれかで使用できる場合でもデータが表示されます。

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

あなたの2つのクエリが実行され、その後、別の行にアップロード及びダウンロードを識別するために余分なフィールドと一緒に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') 

用食品かもしれ試みることができる

は、すべてのパッケージを選択して参加しようとすると、値がないところだろうjoinはnullを返します。

0

これを行う方法はいくつかあります。主キーと外部キーを使用して参加できます。場合あなたは、テーブル間の関係を持っていない場合は、

あなたが使用することができます

  • LEFT/LEFT OUTERが

左の表からの戻り値のすべてのレコードをして、JOIN、JOIN右側の表の レコードに一致しました。一致するものがない場合は 右端からNULLの結果が得られます。

  • はRIGHT/RIGHT OUTER JOINを左の表から右の表から

戻り値のすべてのレコードをし、マッチした レコードを登録しよう。結果はNULLの左から 側に一致するものがありません。左または右のテーブルのレコードのいずれかで試合があるとき

  • FULL OUTERは

リターンにすべてのレコードを登録しよう。

  • UNION

は、二つ以上のSELECT文の結果セットを組み合わせるために使用されています。

UNION内の各SELECTステートメントは、各SELECTステートメントも同じ順序でなければならない列も同様のデータタイプ列のを持たなければならない 列の同じ数、 を有していなければなりません。

  • INNERは、両方のテーブルで一致する値を持つ

選択したレコードを登録しよう。これはあなたの状況に適しています。

  • INTERSECT

は、MySQLをサポートしていません。

  • NATURALは、すべての列名が一致しなければならない

を登録しよう。

これらを更新する必要はないので、結合テーブルからviewを作成すると、PHPでクエリを少なくすることができます。しかし、ビューは更新できません。テーブル間の関係については言及していませんでした。そのため私はUNIONと一緒に行く必要があります。

SELECT * FROM checkStatus 

learn more:このように

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 

は次にどこでも、あなたはあなただけの1行を必要とする選択します。

関連する問題