I am trying to create a derived table from a few different tables, everything works if i do single inner join, but when i add more joins i can't get the desired result. Here is what i got now:
Table structure:
First table:
+------------+------------+------+-----+---------+-------+
| 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 | |
+------------+------------+------+-----+---------+-------+
Second table:
+--------------------+---------------------+------+-----+------------+----------------+
| 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 | |
+--------------------+---------------------+------+-----+------------+----------------+
Here is what i do now - first of all i create a view of both tables after joining them into one big table:
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);
Now what i need is to join the table to itself so i could get rows from 'VALUE' in different COLUMNS, i do it like this:
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;
and i get good result like that:
+------------+--------+--------+-------+
| 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 |
+------------+--------+--------+-------+
But if i try adding one more join like that:
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;
the data returned is not what i expect, not all values are selected. Maybe there is something wrong with the second inner join, i'm stuck with this for hours and can't understand why the single join query works fine and the last one doesn't.
Thanks for any help !
EDIT result data:
+------------+--------+-------+-------+-------+
| TAG_DEV_ID | TAG_ID | VALUE | VALUE | VALUE |
+------------+--------+-------+-------+-------+
| 1 | 4 | -0.5 | 3 | 0 |
| 2 | 14 | -12.7 | 0.5 | 1.6 |
+------------+--------+-------+-------+-------+
and i expect it to be something like that:
+------------+--------+-------+-------+-------+
| 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 |
+------------+--------+-------+-------+-------+