78 votes

MySQL - Sélection de données dans plusieurs tables ayant toutes la même structure mais des données différentes

Ok, voici mon dilemme J'ai une base de données constituée d'environ 5 tables ayant toutes exactement la même structure de données. Les données sont séparées de cette manière à des fins de localisation et pour diviser un total d'environ 4,5 millions d'enregistrements.

La plupart du temps, une seule table est nécessaire et tout va bien. Cependant, il arrive que l'on ait besoin de données provenant de deux ou plusieurs tableaux et qu'elles doivent être triées selon une colonne définie par l'utilisateur. C'est là que je rencontre des problèmes.

colonnes de données :

id, band_name, song_name, album_name, genre

Déclaration MySQL :

SELECT * from us_music, de_music where `genre` = 'punk'

MySQL génère cette erreur :

#1052 - Column 'genre' in where clause is ambiguous

Manifestement, je m'y prends mal. Quelqu'un peut m'éclairer sur ce point ?

3voto

staticsan Points 14435

Votre tentative originale de couvrir les deux tables crée une JOIN implicite. Ceci est désapprouvé par la plupart des programmeurs SQL expérimentés car il sépare les tables à combiner avec la condition du comment.

El UNION est une bonne solution pour les tables telles qu'elles sont, mais il ne devrait y avoir aucune raison pour qu'elles ne puissent pas être placées dans une seule table avec une indexation décente. J'ai vu l'ajout d'un index correct à une grande table augmenter la vitesse d'interrogation de trois ordres de grandeur.

0voto

Jongosi Points 446

Une autre méthode (qui peut être plus facile à lire) consiste à utiliser des alias de table. Cela permet d'obtenir une requête plus claire :

SELECT 
    us.id AS us_id, 
    us.band_name AS us_band_name, 
    us.song_name AS us_song_name, 
    us.album_name AS us_album_name, 
    us.genre AS us_genre,
    de.id AS de_id, 
    de.band_name AS de_band_name, 
    de.song_name AS de_song_name, 
    de.album_name AS de_album_name, 
    de.genre AS de_genre
FROM 
    us_music AS us, 
    de_music AS de
WHERE
    us.genre = 'punk'
    AND
    de.genre = 'punk';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X