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?
Je pense que vous recherchez la clause UNION , à la
(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
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.
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 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 .
L'instruction union
provoque un temps de transaction en énormes données. Il est bon d’effectuer la sélection en 2 étapes:
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.