2013-07-30 13 views
5

Jestem nowy w MySQL. Nie jestem pewien, czy mam rację. Potrzebuję pomocy.Dynamicznie dołącz do tabeli MySQL

mam tabeli survey które mają następujące kolumny:

id, source_type, source_id, survey_date_time.

Pozostałe dwie tabele są:

education które mają id, col1, col2, col3 kolumn.

które mają kolumny id, col4, col5, col6.

danych w survey tabeli:

id  source_type source_id survey_date_time 
-------------------------------------------------------- 
100  education   1   2013-07-25 00:00:00 
101  games    1   2013-07-25 00:00:00 
102  games    2   2013-07-26 00:00:00 
103  education   2   2013-07-26 00:00:00 

danych w education stół

id col1   col2   col3  
-------------------------------------------- 
1  col1_data1 col2_data1 col3_data1 
2  col1_data2 col2_data2 col3_data2 

Dane w tabeli games

id col4   col5   col6  
-------------------------------------------- 
1  col4_data1 col5_data1 col6_data1 
2  col4_data2 col5_data2 col6_data2 

chcę czytać dy danych namically lubię:

select * from survey left join {survey.sorce_type} on {survey.sorce_type}.id=survey.source_id where survey.id={given_id}

można znaleźć schemat here

Z góry dzięki.

UPDATE: SELECT będzie survey.*, {survey.sorce_type}.* zamiast *

Dzięki

+0

Z technicznego punktu widzenia należy użyć dynamicznego SQL, co oznacza, że ​​składnia MySQL Przygotowana instrukcja składnia – Jivan

Odpowiedz

6

Należy to osiągnąć to, czego szukasz:

SELECT * 
    FROM survey s 
    LEFT JOIN eduction e ON s.source_type = 'education' AND e.id = s.source_id 
    LEFT JOIN games g ON s.source_type = 'games' AND g.id = s.source_id 

SQL Fiddle jest here.

Zasadniczo przyłącza się do odpowiedniej tabeli na podstawie source_type. Więc kiedy jest education dołącza do tabeli eduction (możesz mieć błąd w pisowni) i kiedy jest games dołącza do tabeli games.

+1

ma obecnie dwie tabele. edukacja, gry. ale w przyszłości będzie więcej stołów. więc nie mogę dodać sprzężenia dla każdej tabeli. –

+0

Należy przeprojektować strukturę tabeli ... np. survey_data: survey_type_id, col1, col2, col3, col4, col5, col6. survey_type: id, type_name. survey: id, survey_type_id, survey_data_id, date_created. – AEQ

+0

@AEQ Czy możesz wyjaśnić to podejście, sugerujesz coś więcej? – antoniovassell

1

W tym celu należy utworzyć procedurę z przygotowanymi wyciągami.

DELIMITER | 
CREATE PROCEDURE `JoinWithSurvey`(param_leftTable VARCHAR(50), param_id VARCHAR(10)) 
BEGIN 
SET @QUERY1 = concat('select survey.*,',param_leftTable,'.* from survey left join ',param_leftTable,' on ',param_leftTable,'.id=survey.source_id where survey.id = ', param_id ,';'); 
PREPARE stmt FROM @QUERY1; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END | 

Następnie zadzwonić że SP

call JoinWithSurvey('eduction','100'); 

ID SOURCE_TYPE SOURCE_ID SURVEY_DATE_TIME COL1 COL2 COL3 
100 education 1 July, 25 2013 00:00:00+0000 col1_data1 col2_data1 col3_data1 

call JoinWithSurvey('games','102'); 

ID SOURCE_TYPE SOURCE_ID SURVEY_DATE_TIME COL4 COL5 COL6 
102 games 2 July, 26 2013 00:00:00+0000 col4_data2 col5_data2 col6_data2 
102 education 2 July, 26 2013 00:00:00+0000 col4_data2 col5_data2 col6_data2 

zdałem id jako varchar tutaj .. Można używać jako liczba całkowita typu jak dobrze ..:)

spróbować

Working fiddle here

+0

Dzięki. Ale czy istnieje rozwiązanie, w którym nie muszę podawać nazwy tabeli (która jest typem "source_type")? Po prostu chcę przekazać tabelę 'survey'' id'. Tabela będzie się dynamicznie łączyć z "ankieta" z 'source_type'. –

+1

W jaki sposób system będzie wiedział, że musisz dołączyć do tych wszystkich tabel, chyba że powiedziałeś systemowi, aby dołączył. ? Alternatywne rozwiązanie jest już wskazane przez Martina Parkina, w którym musisz powiedzieć wszystkim tabelom, aby do nich dołączyć. Mam nadzieję, że masz rację. –

+0

Kolumna 'source_type' jest nazwą tabeli. Jeśli mam identyfikator, to znajdę tabelę z kolumny 'source_type'. –