2017-09-30 12 views
0

別のテーブルからカラムを選択し、同時に2つのテーブルを含む1つの結果を表示する正しい方法を見つけるのは大変な作業です。右ジョイント/インナージョイント/マルチセレクション[MYSQL]テーブル結果

まずテーブル:

id | times  | project_id | 
12 | 12.24  | 40   | 
13 | 13.22  | 40   | 
14 | 13.22  | 20   | 
15 | 12.22  | 20   | 
16 | 13.30  | 40   | 

第二表:私はPROJECT_ID = 40のための最初のテーブルからすべての時間を選択し、第二のテーブルのためのこの時間に参加することを期待

id | times  | project_id | 
32 | 22.24  | 40   | 
33 | 23.22  | 40   | 
34 | 23.22  | 70   | 
35 | 22.22  | 70   | 
36 | 23.30  | 40   | 

同じproject_id = 40です。

id | time  | time  | project_id | 
12 | 12.24  | 22.24  | 40   | 
13 | 13.22  | 23.22  | 40   | 
16 | 13.30  | 23.30  | 40   | 
+1

第1のテーブルの時刻「12.24」が第2のテーブルの時刻「22.24」に合流するのはなぜですか?行の順序だけで?これが困難な理由は、テーブル内の行に暗黙の順序またはランキングがないためです。結合は、行の位置ではなく、値を照合することによって機能します。 –

+0

はい時間が異なります。私は行の順番で選択したい、それだけです。 –

+0

ここで、「右結合」は必要ありません –

答えて

1

あなたがそうでなければ、誤った結果を取得するこれらの2つのテーブル間のUNION ALLを使用する必要があります。

結果は以下のようにする必要があります。あなたが一緒にすべての行を持っていたら、あなたは、このような本SQL Fiddle

のMySQL 5.6スキーマのセットアップで、以下に示すと実証されているように、「以前の値」を超える運ぶために変数を使用できます。

CREATE TABLE Table1 
    (`id` int, `times` decimal(6,2), `project_id` int) 
; 

INSERT INTO Table1 
    (`id`, `times`, `project_id`) 
VALUES 
    (12, 12.24, 40), 
    (13, 13.22, 40), 
    (14, 13.22, 20), 
    (15, 12.22, 20), 
    (16, 13.30, 40) 
; 


CREATE TABLE Table2 
    (`id` int, `times` decimal(6,2), `project_id` int) 
; 

INSERT INTO Table2 
    (`id`, `times`, `project_id`) 
VALUES 
    (32, 22.24, 40), 
    (33, 23.22, 40), 
    (34, 23.22, 70), 
    (35, 22.22, 70), 
    (36, 23.30, 40) 
; 

クエリを1

select 
     project_id, id, prev_time, times 
from (
    select 
      @row_num :=IF(@prev_value=d.project_id,@row_num+1,1) AS RowNumber 
     , d.* 
     , IF(@row_num %2 = 0, @prev_time, '') prev_time 
     , @prev_value := d.project_id 
     , @prev_time := times 
    from (
      select `id`, `times`, `project_id` from Table1 
      union all 
      select `id`, `times`, `project_id` from Table2 
     ) d 
    cross join (select @prev_value := 0, @row_num := 0) vars 
    order by d.project_id, d.times 
    ) d2 
where prev_time <> '' 

Results

| project_id | id | prev_time | times | 
|------------|----|-----------|-------| 
|   20 | 14 |  12.22 | 13.22 | 
|   40 | 13 |  12.24 | 13.22 | 
|   40 | 32 |  13.30 | 22.24 | 
|   40 | 36 |  23.22 | 23.3 | 
|   70 | 34 |  22.22 | 23.22 | 

注:この回答が作成された時点で、MySQL doe snotは現在LEAD()およびLAG()関数をサポートしています。 MySQLがこれらをサポートしている場合、そのアプローチはより簡単で、おそらくより効率的になります。