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 ?

175voto

Mihai Limbășan Points 17205

Je pense que vous cherchez le UNION clause, à la

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')

19voto

Ned Batchelder Points 128913

Il semble que vous seriez plus heureux avec une seule table. Le fait que les cinq éléments aient le même schéma et qu'ils doivent parfois être présentés comme s'ils provenaient d'une seule table plaide en faveur d'une table unique.

Ajouter une nouvelle colonne qui peut être utilisée pour distinguer entre les cinq langues (je suppose que c'est la langue qui est différente entre les tables puisque vous avez dit que c'était pour la localisation). Ne vous inquiétez pas d'avoir 4,5 millions d'enregistrements. Toute vraie base de données peut gérer cette taille sans problème. Ajoutez les bons index, et vous n'aurez aucun problème à les traiter comme une seule table.

5voto

Moo Points 4434

Toutes les réponses ci-dessus sont valables, ou une autre solution consiste à étendre le nom de la table pour inclure le nom de la base de données - par exemple :

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

4voto

La colonne est ambiguë parce qu'elle apparaît dans les deux tables. Il faudrait donc spécifier le champ où (ou le champ de tri) de manière complète, par exemple us_music.genre ou de_music.genre, mais on spécifie généralement deux tables si l'on veut ensuite les réunir d'une manière ou d'une autre. La structure à laquelle vous avez affaire est parfois appelée table partitionnée, bien qu'elle soit généralement utilisée pour séparer l'ensemble de données en fichiers distincts plutôt que de diviser l'ensemble de données de façon arbitraire. Si vous êtes en charge de la structure de la base de données et qu'il n'y a pas de bonne raison de partitionner les données, je construirais une grande table avec un champ supplémentaire "origine" contenant un code de pays, mais vous le faites probablement pour des raisons légitimes de performance. Utilisez une union pour joindre les tables qui vous intéressent. http://dev.mysql.com/doc/refman/5.0/en/union.html ou en utilisant le moteur de base de données Merge http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html .

3voto

mehdi mohamadi Points 21

El union provoque un temps d'attente dans les données volumineuses. Il est bon d'effectuer la sélection en 2 étapes :

  1. sélectionnez l'id
  2. puis sélectionnez la table principale avec elle

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