2017-06-27 23 views
0

数の異なる複数の異なる列に2つの表を結合:私は2つのテーブルを持つ行

一時スキーマと7027行は

+-------------+-------------+------+-----+---------+-------+ 
    | Field  | Type  | Null | Key | Default | Extra | 
    +-------------+-------------+------+-----+---------+-------+ 
    | ip   | varchar(32) | YES |  | NULL |  | 
    | month  | int(2)  | YES |  | NULL |  | 
    | day   | int(2)  | YES |  | NULL |  | 
    | hour  | int(2)  | YES |  | NULL |  | 
    | totcount | bigint(21) | YES |  | NULL |  | 
    +-------------+-------------+------+-----+---------+-------+ 

下に示されているとTEMP1を示すスキーマで再び4972行を有する

+-------------+-------------+------+-----+---------+-------+ 
    | Field  | Type  | Null | Key | Default | Extra | 
    +-------------+-------------+------+-----+---------+-------+ 
    | ip   | varchar(32) | YES |  | NULL |  | 
    | month  | int(2)  | YES |  | NULL |  | 
    | day   | int(2)  | YES |  | NULL |  | 
    | hour  | int(2)  | YES |  | NULL |  | 
    | compcount | bigint(21) | YES |  | NULL |  | 
    +-------------+-------------+------+-----+---------+-------+ 

の下に私は何をしようとしていることで、一時のデータにTEMP1から列compcountを付ける0またはNULL値のどこに値がない場合compcount。 temp1に存在するip、month、day、hourの組み合わせもすべてtempに存在しますが、その反対は真ではありません。私は一時がある場合

例として、以下のよう

+----------------+-------+------+------+----------+ 
    | ip    | month | day | hour | totcount | 
    +----------------+-------+------+------+----------+ 
    | 0.0.0.0  |  1 | 17 | 0 |  215 | 
    | 0.0.0.0  |  1 | 18 | 1 |  490 | 
    | 0.0.0.0  |  1 | 19 | 0 |  749 | 
    | 0.0.0.0  |  1 | 20 | 0 |  471 | 
    | 0.0.0.0  |  1 | 21 | 15 |  330 | 
    | 0.0.0.0  |  1 | 22 | 15 |  45 | 
    | 0.0.0.0  |  1 | 23 | 14 |  214 | 
    | 0.0.0.0  |  2 | 25 | 1 |  13 | 
    | 1.1.1.1  |  1 | 17 | 21 |  58 | 
    | 1.1.1.1  |  1 | 18 | 22 |  70 | 
    | 1.1.1.1  |  1 | 20 | 22 |  89 | 
    | 1.1.1.1  |  1 | 21 | 11 |  67 | 
    +----------------+-------+------+------+----------+ 

とTEMP1:

+----------------+-------+------+------+----------+ 
    | ip    | month | day | hour | compcount| 
    +----------------+-------+------+------+----------+ 
    | 0.0.0.0  |  1 | 17 | 0 |  100 | 
    | 0.0.0.0  |  1 | 18 | 1 |  176 | 
    | 0.0.0.0  |  1 | 21 | 15 |  182 | 
    | 0.0.0.0  |  1 | 22 | 15 |  36 | 
    | 0.0.0.0  |  1 | 23 | 14 |  198 | 
    | 1.1.1.1  |  1 | 17 | 21 |  46 | 
    | 1.1.1.1  |  1 | 18 | 22 |  53 | 
    | 1.1.1.1  |  1 | 20 | 22 |  27 | 
    | 1.1.1.1  |  1 | 21 | 11 |  61 | 
    +----------------+-------+------+------+----------+ 

が、私はあることが結果のテーブルを希望:

+----------------+-------+------+------+----------+----------+ 
    | ip    | month | day | hour | totcount |compcount | 
    +----------------+-------+------+------+----------+----------+ 
    | 0.0.0.0  |  1 | 17 | 0 |  215 |  100 | 
    | 0.0.0.0  |  1 | 18 | 1 |  490 |  176 | 
    | 0.0.0.0  |  1 | 19 | 0 |  749 |  0 | 
    | 0.0.0.0  |  1 | 20 | 0 |  471 |  0 | 
    | 0.0.0.0  |  1 | 21 | 15 |  330 |  182 | 
    | 0.0.0.0  |  1 | 22 | 15 |  45 |  36 | 
    | 0.0.0.0  |  1 | 23 | 14 |  214 |  198 | 
    | 0.0.0.0  |  2 | 25 | 1 |  13 |  0 | 
    | 1.1.1.1  |  1 | 17 | 21 |  58 |  46 | 
    | 1.1.1.1  |  1 | 18 | 22 |  70 |  53 | 
    | 1.1.1.1  |  1 | 20 | 22 |  89 |  27 | 
    | 1.1.1.1  |  1 | 21 | 11 |  67 |  61 | 
    +----------------+-------+------+------+----------+----------+ 

Iをクエリを試しました

select temp.ip, temp.month, temp.day, temp.hour, temp.totcount, 
    temp1.compcount from temp1 left outer join temp on 
    temp.ip=temp1.ip and temp.month=temp1.month and 
    temp.day=temp1.day and temp.hour=temp1.hour order by ip; 

ですが、4972行しか返されませんでした。どのように私は探しているものを返すようにクエリを構築するのですか?

+0

を使うのか?違いが予期しないものではないことを確認しようとしています。 – cwallenpoole

答えて

1

LEFT JOINを使用すると、最初のテーブルはすべての行を持ち、2番目のテーブルは一致しないテーブルです。

テーブルの順序を変更するか、RIGHT JOINを使用してください。

select temp.ip, temp.month, temp.day, temp.hour, temp.totcount, 
     temp1.compcount 
from temp 
left outer join temp1 on 
    temp.ip=temp1.ip and temp.month=temp1.month and 
    temp.day=temp1.day and temp.hour=temp1.hour 
order by ip, month, day, hour; 

DEMO

そして、あなたは結果に0代わりのNULLをしたい場合は、あなただけの「外部結合」または「右の参加」に切り替える場合はどうなりますIFNULL(temp1.compcount, 0) AS compcount

+0

私はそれを変更し、クエリは現在実行にかなりの時間がかかります。 EXPLAINコマンドを実行しましたが、タイプがALLとしてリストされており、 "possible_keys"、 "key"、および "key_len"の値はすべてNULLです。これをスピードアップするためにキーを利用する方法はありますか? – Caitlin

+1

'(ip、month、day、hour)'(あるいは少なくともこれのサブセット)に複合インデックスを両方のテーブルに追加します。 – Barmar

関連する問題