2010-02-23 7 views
2

J'essaie de construire une requête de sélection où il faudra prendre toutes les colonnes de 4 tables puis de commander et afficher les résultats par la colonne 'nom' (le même dans toutes les tables) . Je suis encore en train d'apprendre les ficelles de MySQL.mysql select query help - COMMANDER PAR

Je trouve que parce que les colonnes partagent le nom 'nom', seuls les résultats de la dernière table sont affichés. Existe-t-il un moyen d'effectuer cette requête qui conserve toutes les données de toutes les tables?

Dois-je utiliser des noms de colonne différents? Il semble plus facile de partager un nom puisque c'est la même information dans chacun.

SELECT * FROM table_one, table_two, table_three, table_four ORDER BY... 

Les quatre tables ne se sont joints, et la structure est différente ... Quelques noms de colonnes sont partagés (qui il semble que je devrais fixer, je peux encore à ce moment), mais chacun a une quantité différente de colonnes.

Merci!

+0

sont ces 4 tables avec la même structure? – van

+0

Non, les quatre tables ne sont pas jointes et la structure est différente ... Certains noms de colonnes sont partagés (ce qui semble devoir être réparé, je peux encore le faire à ce stade), mais chacun a une quantité différente de colonnes. –

+1

Vous êtes incorrect, dans votre requête, les tables sont jointes; ils sont croisés. Ce n'est certainement pas ce que vous voulez en fonction de ce que vous avez écrit. C'est aussi pourquoi la jointure implicite est une mauvaise pratique et ne devrait pas être utilisée. – HLGEM

Répondre

0

Oui, vous devez utiliser différents noms de colonnes, mais pour obtenir toutes les données aussi vous pouvez écrire quesries comme ceci:

SELECT table_one.* t1, table_two.* t2, table_three.* t3, table_four.* t4 FROM table_one, table_two, table_three, table_four ORDER BY... 
3

S'il n'y a pas de relation entre les quatre tables, utilisez UNION s au lieu:

SELECT a.name 
    FROM TABLE_ONE a 
UNION 
SELECT b.name 
    FROM TABLE_TWO b 
UNION 
SELECT c.name 
    FROM TABLE_THREE c 
UNION 
SELECT d.name 
    FROM TABLE_FOUR d 
ORDER BY name 

Il y a deux options ici - UNION est plus lent, car il supprimera les doublons - la liste finale sera une liste unique de noms. UNION ALL est plus rapide car il ne supprime pas les doublons.

Pour obtenir les colonnes des tables ainsi, utilisez:

SELECT a.*, 
     b.*, 
     c.*, 
     d.* 
    FROM (SELECT a.name 
      FROM TABLE_ONE a 
     UNION 
     SELECT b.name 
      FROM TABLE_TWO b 
     UNION 
     SELECT c.name 
      FROM TABLE_THREE c 
     UNION 
     SELECT d.name 
      FROM TABLE_FOUR d) x 
LEFT JOIN TABLE_ONE a ON a.name = x.name 
LEFT JOIN TABLE_TWO b ON b.name = x.name 
LEFT JOIN TABLE_THREE c ON c.name = x.name 
LEFT JOIN TABLE_FOUR d ON d.name = x.name 
+0

Cela fonctionne parfaitement mais ne récupère que la colonne de nom. J'essaie de récupérer toutes les colonnes (ou les colonnes sélectionnées) afin que je puisse les faire écho avec la colonne de nom. En d'autres termes, je veux que la liste soit triée par nom, mais que d'autres colonnes (description, start_time) apparaissent également ... J'aurais dû être plus clair à ce sujet ... mais c'est excellent! –

+0

@johnny_n: Mise à jour, mais vous obtiendrez beaucoup de colonnes nulles, et probablement des doublons en fonction de la quantité de données que vous avez. –

+0

@OMG Ponies - merci, et j'apprécie l'avertissement.Peut-être un meilleur moyen est d'interroger seulement certaines colonnes ... Je suis sûr que je peux faire ce travail. Courbe d'apprentissage définie ici! ;-) –

0

johnny_n,

Vous devez utiliser

SELECT name as name1, name as name2, name as name3 etc... 

Il est évident que vous devez utiliser la syntaxe correcte, mais en utilisant le mot-clé AS, vous permettra d'utiliser la clé que vous voulez dans votre requête.

+0

Vous avez besoin d'alias de table, sinon vous obtiendrez des erreurs de collision de noms car il existe une colonne 'name' dans chacune des tables. –

0

S'ils partagent tous les mêmes s name de » ....

SELECT * 
    FROM table_one 
LEFT JOIN 
    table_two USING(name) 
LEFT JOIN 
    table_three USING(name) 
LEFT JOIN 
    table_four USING(name) 
ORDER BY name