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

StackOverflow https://stackoverflow.com/questions/409705

Question

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

La plupart du temps, une seule table est nécessaire et tout va bien. Cependant, il est parfois nécessaire de disposer de données provenant d'au moins 2 tables et de les trier selon une colonne définie par l'utilisateur. C'est là que j'ai 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 crache cette erreur:

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

Évidemment, je ne le fais pas correctement. Quelqu'un veut-il m'éclairer?

Était-ce utile?

La solution

Je pense que vous recherchez la clause UNION . , à la

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

Autres conseils

On dirait que vous seriez plus heureux avec une seule table. Les cinq ayant le même schéma, et ayant parfois besoin d’être présentés comme s’ils venaient d’une table, ont l’intention de tout mettre dans une table.

Ajoutez une nouvelle colonne qui peut être utilisée pour distinguer les cinq langues (je suppose que c'est une langue 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 de disques. Toute base de données réelle peut gérer cette taille sans problème. Ajoutez les index corrects et vous n'aurez aucun mal à les traiter comme une seule table.

Chacune des réponses ci-dessus est valide, ou une autre méthode consiste à développer le nom de la table pour inclure également 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'

La colonne est ambiguë car elle apparaît dans les deux tables. Vous devez spécifier complètement le champ where (ou trier), tel que us_music.genre ou de_music.genre, mais vous devez généralement spécifier deux tables si vous souhaitez ensuite les rejoindre. les ensemble d'une certaine façon. La structure avec laquelle vous traitez est parfois appelée une table partitionnée, bien que cela soit généralement fait également pour séparer le jeu de données en fichiers distincts plutôt que pour simplement scinder le jeu de données de façon arbitraire. Si vous êtes responsable 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 une "origine" supplémentaire. champ qui contient un code de pays mais vous le faites probablement pour des raisons de performance légitimes. Soit vous utilisez une union pour rejoindre les tables qui vous intéressent http: / /dev.mysql.com/doc/refman/5.0/fr/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 .

Votre tentative originale d'étendre les deux tables crée une JOIN implicite. La plupart des programmeurs SQL expérimentés désapprouvent ce principe, car il sépare les tables à associer à la condition de comment.

Le UNION est une bonne solution pour les tables telles quelles, mais il ne devrait y avoir aucune raison pour qu'elles ne puissent pas être placées dans la seule table avec une indexation correcte. Nous avons constaté que l'ajout de l'index correct à une table volumineuse augmentait la vitesse de requête de trois ordres de grandeur.

L'instruction union provoque un temps de transaction en énormes données. 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top