2017-12-08 8 views
0

私は2つのテーブルinternal_mailexternal_mailを持っています。私は両方のテーブルのdate_of_arrivalと呼ばれる日付列で両方のテーブルからすべてのレコードを注文しようとしています。異なる列を持つ2つのテーブルを照会しますが、1つは無関係です

たとえば、これはinternal_mail次のとおりです。

colunm 1   colunm 2   colunm 3   date_of_arrival 
some_record  some_record  some_record  2017/8/12 
.....    .....    .....    ..... 
.....    .....    .....    ..... 
.....    .....    .....    ..... 
.....    .....    .....    ..... 

そして、これがexternal_mailです:

colunm A   colunm B   colunm C   date_of_arrival 
another_record another_record another_record  2017/7/12 
.....    .....    .....    ..... 
.....    .....    .....    ..... 
.....    .....    .....    ..... 
.....    .....    .....    ..... 

私はここで達成しようとしている何(で降順の場合)、このようなものです:

colunm 1 colunm 2 colunm 3 column A column B column C date_of_arrival 
s_r  s_r  s_r  empty  empty  empty  2017/8/12 
empty  empty  empty  a_r  a_r  a_r  2017/7/12 
s_r  s_r  s_r  empty  empty  empty  2017/8/12 
empty  empty  empty  a_r  a_r  a_r  2017/7/12 
+0

日付が一致する場合はどうなりますか?あなたはそれらを1つの列に表示する必要がありますか? –

+0

@ VamsiPrabhalaはい、両方のテーブルの日付が一致すると、テーブルのすべてのカラムが表示されます – Amine

答えて

2

full joinでこれを行うことができます。 MySQLがサポートしていないので、union allが最適です。両方のテーブルで日付が一致したときにレコードを1行に表示する必要があると仮定すると、date_of_arrivalで集計する必要があります。そうでない場合は、集約を省略し、内側のクエリを使用します。

select max(column_1),max(column_2),max(column_3),max(columnA),max(columnB),max(columnC),date_of_arrival 
from (select column_1,column_2,column_3, 
     null as columnA,null as columnB,null as columnC,date_of_arrival 
     from internal_email 
     union all 
     select null,null,null,columnA,columnB,columnC,date_of_arrival 
     from external_email 
    ) t 
group by date_of_arrival 
+0

4行しか返しません。 – Amine

+0

あなたのソリューションは正確に内側のクエリを処理します。しかし、両方のテーブルの日付が一致したときに、1行のすべてのデータを表示する完全なソリューションでは、61レコードのうち4つしか返されません。 – Amine

1

最初の部分は簡単なUNIONクエリですが、両方のテーブルに指定された日付のデータがある場合は、行を統一します。これは日付でFULL OUTER JOINによって達成されますが、MySQLはFULL OUTER JOINをサポートしていません。

は、だからここの回避策の例(未テスト)です:

SELECT 
    MAX(column1) AS column1, 
    MAX(column2) AS column2, 
    MAX(column3) AS column3, 
    MAX(columnA) AS columnA, 
    MAX(columnB) AS columnB, 
    MAX(columnC) AS columnC, 
    date_of_arrival 
FROM (
    (SELECT column1, column2, column3, 
     NULL AS columnA, NULL AS columnB, NULL AS columnC, 
     date_of_arrival 
    FROM internal_mail) 
    UNION ALL 
    (SELECT NULL, NULL, NULL, columnA, columnB, columnC, 
     date_of_arrival 
    FROM external_mail) 
) AS t 
GROUP BY date_of_arrival; 

GROUP BYは、両方のUNION句のテーブルが同じ日付で行を持っている場合でも、1行に同じ日付で行を組み合わせることです。

しかし、この結合された行には、各列にnull以外の値を設定します。指定された日付の2行のグループでは、一方の行はNULL以外の値を持ち、もう一方の行はNULL値を持ちます。 MAX()はnullを無視し、他の単一の値をとります。 MIN()もちょうどよく働いています。なぜなら、それはちょうど1行のセットから選択しているからですが、MAX()を使用することを任意に選択しました。

+1

これで 'MAX()'の使い方は何ですか? – Amine