2009-03-30 12 views
0

J'ai trois tablesComment joindre (fusionner?) Plusieurs tables?

AUTHOR_TABLE 
------------- 
AUTHOR_ID (PK) AUTHOR_NAME 
1    me 
2    you 

ARTICLE_AUTHOR_TABLE 
------------- 
AUTHOR_ID ARTICLE_ID 
1   100 
2   101 


EVENT_AUTHOR_TABLE 
------------------------------------------ 
AUTHOR_ID EVENT_ID 
1   200 
1   201 

Tout ce que je veux est soit

RESULTS 
----------------------------------------- 
AUTHOR_ID AUTHOR_NAME SOURCE_TABLE ID 
1   me   article  100 
2   you   article  101 
1   me   event  200 
1   me   event  201 

/* where SOURCE_TABLE would be either "EVENT" or "ARTICLE" */ 

EDIT Je ne veux pas vraiment ce

RESULTS 
----------------------------------------- 
AUTHOR_ID AUTHOR_NAME EVENT_ID ARTICLE_ID 
1   me   NULL   100 
2   you   NULL   101 
1   me   200   NULL 
1   me   201   NULL 

Les pointeurs appréciés.

THanks

Répondre

3
SELECT 
    at.author_id, 
    at.author_name, 
    'article' AS source_table, 
    aat.id 
FROM 
    author_table at 
    JOIN article_author_table aat 
    ON at.author_id = aat.author_id 

UNION ALL 

SELECT 
    at.author_id, 
    at.author_name, 
    'event' AS source_table, 
    eat.id 
FROM 
    author_table at 
    JOIN event_author_table eat 
    ON at.author_id = eat.author_id 
+0

Je veux vraiment rejoindre environ 10 tables comme ceci, est-ce une mauvaise idée? – inspite

+0

Cela dépend de la quantité de lignes ... mais oui, c'est généralement une mauvaise idée d'avoir autant d'UNIONs. Il reflète principalement des DB mal conçus, donc si vous le pouvez, ce serait une bonne idée de les restructurer. Sinon, encore une fois, cela dépendra du nombre de lignes que vous prévoyez gérer. – Seb

+0

OK Merci, oui c'est une mauvaise conception de base de données (de votre part) quelque chose que j'ai fait il y a environ 10 ans, et j'écris juste un rapport ad-hoc, donc je vais devoir vivre avec pour l'instant: D – inspite

1
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, EA.EVENT_ID, AA.ARTICLE_ID 
FROM AUTHOR_TABLE AS A 
    LEFT JOIN ARTICLE_AUTHOR_TABLE AS AA ON AA.AUTHOR_ID = A.AUTHOR_ID 
    LEFT JOIN EVENT_AUTHOR_TALBE AS EA ON EA.AUTHOR_ID = A.AUTHOR_ID 
+0

Cela ne produit pas ce qu'il demande ... il veut montrer à la fois des articles et des événements dans le même resultset, pas seulement des articles. – Seb

+0

Maintenant c'est mieux :) Mais il y a un moyen d'aller chercher le premier résultat désiré; regarde ma réponse. – Seb

0

Depuis c'est des devoirs, et je devine que vous utilisez MySQL, read this documentation on the UNION syntax. Ce que vous faites est fondamentalement faire deux (ou plus) requêtes de bases de données similaires et obtenir les résultats dans une requête.

Soyez avisé que les colonnes résultantes doivent être identiques.

Vous pouvez également créer des variables pour afficher la table à partir de laquelle vous appelez.

SELECT AUTHOR_ID, AUTHOR_NAME, `AUTHOR_TABLE` AS SOURCE_TABLE, ID FROM AUTHOR_TABLE 

Vous faites cela pour tous les syndicats mais changez le nom de la table.

+0

Btw puisque c'est devoirs j'ai décidé de ne pas faire la réponse complète, comme Seb a fait. –

+0

BTW ce n'est pas devoirs, je l'ai simplifié pour ressembler à des devoirs: D – inspite

+0

Quand j'ai répondu, il n'a pas été étiqueté comme devoirs :) Je déteste quand les gens marquent d'autres questions à la maison juste parce qu'ils semblent simples. – Seb