あなたがそうでなければ、誤った結果を取得するこれらの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がこれらをサポートしている場合、そのアプローチはより簡単で、おそらくより効率的になります。
第1のテーブルの時刻「12.24」が第2のテーブルの時刻「22.24」に合流するのはなぜですか?行の順序だけで?これが困難な理由は、テーブル内の行に暗黙の順序またはランキングがないためです。結合は、行の位置ではなく、値を照合することによって機能します。 –
はい時間が異なります。私は行の順番で選択したい、それだけです。 –
ここで、「右結合」は必要ありません –