Search code examples
mysqlselectmulti-table

MySql get data from multiple tables results from a select


I have a table "move" like this

----------------------------------
| id | ... | ... |  tab  | idTab |
----------------------------------
| 1  | ... | ... | bike  |  14   |
| 2  | ... | ... | car   |  57   |
| 3  | ... | ... | car   |  23   |
| 4  | ... | ... | bike  |  43   |
| 5  | ... | ... | boat  |  20   |
| .. | ... | ... | ...   | ....  |
----------------------------------

tab "bike"

---------------------------------
| id | code | name  | matr | ... |
---------------------------------
| .. | ...  | ....  | .... | ... |
| 14 | AAA  | MARIO | 111  | ... |
| .. | ...  | ....  | .... | ... |
| 43 | A1C  | JOHN  | EEE  | ... |
| .. | ...  | ....  | .... | ... |
---------------------------------

tab "car"

---------------------------------
| id | code | name  | matr | ... |
---------------------------------
| .. | ...  | ....  | .... | ... |
| 23 | 123  | JACK  | WER  | ... |
| .. | ...  | ....  | .... | ... |
| 57 | 2A2  | FRANK | MSS  | ... |
| .. | ...  | ....  | .... | ... |
---------------------------------

tab "boat"

---------------------------------
| id | code | name  | matr | ... |
---------------------------------
| .. | ...  | ....  | .... | ... |
| 20 | UJN  | PETER | WSX  | ... |
| .. | ...  | ....  | .... | ... |
---------------------------------

I would like to have in a single query all datas of "move" and the datas of each tables present in "move" with specific idTab.

The result will be like this

--------------------------------------------------------------
| id | ... | ... |  tab  | idTab | code | name  | matr | ... |
--------------------------------------------------------------
| 1  | ... | ... | bike  |  14   | AAA  | MARIO | 111  | ... |
| 2  | ... | ... | car   |  57   | 2A2  | FRANK | MSS  | ... |
| 3  | ... | ... | car   |  23   | 123  | JACK  | WER  | ... |
| 4  | ... | ... | bike  |  43   | A1C  | JOHN  | EEE  | ... |
| 5  | ... | ... | boat  |  20   | UJN  | PETER | WSX  | ... |
| .. | ... | ... | ...   | ....  | ...  | ....  | .... | ... |
--------------------------------------------------------------

I don't know in effect if I have or not a specific table in move. I can make a query like this

SELECT * FROM move WHERE id>0 

and then a foreach with

SELECT * FROM move["tab"] WHERE id=move["idTab"]

but is very hard work because table move is very long...

I try with this but (obviously) don't work...

SELECT M.*, T.* FROM move as M, M.tab as T WHERE M.id>0 AND M.idTab=T.id 

Solution

  • Your database design is not ideal, and I don't think you should be having separate tables for each type of vehicle. That being said, if you bring the three tables into a single one using a UNION, then a single join could yield your desired result.

    SELECT t1.*, t2.*
    FROM move t1
    INNER JOIN
    (
        SELECT id, code, name, matr, 'bike' AS tab
        FROM bike
        UNION ALL
        SELECT id, code, name, matr, 'car'
        FROM car
        SELECT id, code, name, matr, 'boat'
        FROM boat
    ) t2
        ON t1.idTab = t2.id AND
           t1.tab   = t2.tab
    

    I added a computed column for the type of table under the assumption that perhaps the same id could appear in more than one vehicle table.