いくつかの異なるテーブルから派生テーブルを作成しようとしています。単一の内部結合を行うとすべてが機能しますが、さらに結合を追加すると、目的の結果が得られません。これが私が今得たものです:
テーブル構造:
最初のテーブル:
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| TAG_ID | int(11) | NO | PRI | NULL | |
| STATUS | int(11) | YES | | NULL | |
| ENABLE | int(11) | YES | | NULL | |
| TIME_STAMP | bigint(20) | YES | | NULL | |
| VALUE | float | YES | | NULL | |
+------------+------------+------+-----+---------+-------+
2 番目のテーブル:
+--------------------+---------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+---------------------+------+-----+------------+----------------+
| TAG_ID | int(11) | NO | PRI | NULL | auto_increment |
| TAG_DEV_ID | int(11) | NO | | NULL | |
| TAG_NAME | varchar(256) | NO | | NA | |
.....................
| TAG_TIME_STAMP | bigint(20) unsigned | NO | | 0 | |
+--------------------+---------------------+------+-----+------------+----------------+
これが私が今やっていることです-まず、1つの大きなテーブルに結合した後、両方のテーブルのビューを作成します:
CREATE VIEW U1_TEMP_TEST AS (SELECT TAG_ID AS TID, VALUE FROM table_1);
CREATE VIEW U1_TEST AS (SELECT * FROM table_2 AS T2 INNER JOIN U1_TEMP_TEST AS T1 ON T2.TAG_ID = T1.TID);
今私が必要とするのは、テーブルをそれ自体に結合して、異なる列の「値」から行を取得できるようにすることです。次のようにします。
SELECT U1.TAG_DEV_ID, U1.TAG_ID, U1.VALUE, U2.VALUE
FROM U1_TEST AS U1
INNER JOIN ((SELECT * FROM U1_TEST
WHERE (TAG_ID = 1 OR TAG_ID = 12 OR TAG_ID = 21)) AS U2)
ON U1.TAG_DEV_ID = U2.TAG_DEV_ID
WHERE (U1.TAG_ID = 4 OR U1.TAG_ID = 20 OR U1.TAG_ID = 14)
GROUP BY U1.TAG_DEV_ID;
そして、私はそのような良い結果を得ます:
+------------+--------+--------+-------+
| TAG_DEV_ID | TAG_ID | VALUE | VALUE |
+------------+--------+--------+-------+
| 1 | 4 | -0.5 | 2.1 |
| 2 | 14 | -12.7 | 0.4 |
| 3 | 20 | -5.7 | 9.5 |
+------------+--------+--------+-------+
しかし、そのような結合をもう1つ追加しようとすると:
SELECT U1.TAG_DEV_ID, U1.TAG_ID, U1.VALUE, U2.VALUE, U3.VALUE
FROM U1_TEST AS U1
INNER JOIN ((SELECT * FROM U1_TEST
WHERE (TAG_ID = 1 OR TAG_ID = 12 OR TAG_ID = 21)) AS U2)
ON U1.TAG_DEV_ID = U2.TAG_DEV_ID
INNER JOIN ((SELECT * FROM U1_TEST
WHERE (TAG_ID = 3 OR TAG_ID = 13 OR TAG_ID = 22)) AS U3)
ON U1.TAG_DEV_ID = U3.TAG_DEV_ID
WHERE U1.TAG_ID = 4 OR U1.TAG_ID = 14 OR U1.TAG_ID = 24
GROUP BY U1.TAG_DEV_ID;
返されたデータは期待したものではありません。すべての値が選択されているわけではありません。2 番目の内部結合に問題がある可能性があります。私はこれに何時間も悩まされており、単一の結合クエリが正常に機能し、最後の結合クエリが機能しない理由を理解できません。
助けてくれてありがとう!
結果データの編集:
+------------+--------+-------+-------+-------+
| TAG_DEV_ID | TAG_ID | VALUE | VALUE | VALUE |
+------------+--------+-------+-------+-------+
| 1 | 4 | -0.5 | 3 | 0 |
| 2 | 14 | -12.7 | 0.5 | 1.6 |
+------------+--------+-------+-------+-------+
そして、私はそれがそのようなものであることを期待しています:
+------------+--------+-------+-------+-------+
| TAG_DEV_ID | TAG_ID | VALUE | VALUE | VALUE |
+------------+--------+-------+-------+-------+
| 1 | 4 | -0.5 | 3 | 0 |
| 2 | 14 | -12.7 | 0.5 | 1.6 |
| 3 | 21 | x | x | x |
+------------+--------+-------+-------+-------+