web-dev-qa-db-fra.com

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 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 pour séparer 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 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

De toute évidence, je le fais mal. Quelqu'un veut-il m'éclairer?

78
Jayrox

Je pense que vous recherchez la clause UNION , à la

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
175
Mihai Limbășan

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 la langue qui diffère 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.

19
Ned Batchelder

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'
5
Moo

La colonne est ambiguë car elle apparaît dans les deux tables. Vous devez spécifier le champ où (ou trier) de manière complète, par exemple us_music.genre ou de_music.genre, mais vous devez généralement spécifier deux tables si vous voulez les joindre ensemble. un peu de mode. 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, alors je construirais une grande table avec un champ "Origine" supplémentaire contenant un code de pays, mais vous le faites probablement pour des raisons de performance légitimes. . Soit vous 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 .

4
Philip Mather

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
3
mehdi mohamadi

Votre tentative initiale d’étendre les deux tables crée un JOIN implicite. La plupart des programmeurs SQL expérimentés désapprouvent ce principe, car il sépare les tables à combiner avec 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.

3
staticsan