MySQL – Sélection des données de plusieurs tables avec la même structure mais des données différentes

Ok, voici mon dilemme J’ai une firebase database 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 diviser un total d’environ 4,5 millions d’enregistrements.

Une majorité du temps, une seule table est nécessaire et tout va bien. Cependant, des données sont parfois nécessaires à partir de deux tables ou plus et doivent être sortingées par 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 

État de 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 me trompe. Quelqu’un a-t-il envie de faire la lumière sur cela pour moi?

Je pense que vous cherchez la clause UNION , a 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 devant parfois être présentées comme si elles provenaient d’un seul sharepoint la table, pour les mettre toutes dans une seule table.

Ajoutez une nouvelle colonne qui peut être utilisée pour distinguer les cinq langues (je suppose que la langue est différente parmi 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 firebase database réelle peut gérer cette taille sans problème. Ajoutez les index corrects et vous n’aurez aucun problème à les gérer en tant que table unique.

Toutes les réponses ci-dessus sont valides, ou une autre manière consiste à étendre le nom de la table pour inclure également le nom de la firebase database – 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. Il vous faudrait alors spécifier le champ where (ou sort) comme us_music.genre ou de_music.genre, mais vous spécifiez généralement deux tables si vous les regroupez dans un peu de mode. La structure que vous traitez est parfois appelée table partitionnée, bien que cela soit généralement fait pour séparer également le jeu de données en fichiers distincts plutôt que de simplement diviser le jeu de données arbitrairement. Si vous êtes responsable de la structure de la firebase database et qu’il n’y a pas de raison de partitionner les données, je construirais une grande table avec un champ “origine” supplémentaire contenant un code de pays, mais probablement pour des raisons de performances légitimes . 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 firebase database de fusion http://dev.mysql.com /doc/refman/5.1/en/merge-storage-engine.html .

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

L’ UNION est une bonne solution pour les tables telles quelles, mais il ne devrait y avoir aucune raison pour laquelle elles ne peuvent pas être placées dans le même tableau avec une indexation correcte. J’ai vu l’ajout de l’index correct à une grande table augmente la vitesse de requête de trois ordres de grandeur.

La déclaration union crée un temps de négociation en données énormes. 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