1
votes

Rejoignez toutes les tables préfixées en une seule

J'ai plusieurs tables, c'est-à-dire jibs3_posts , jibs4_posts , jibs5_posts .. et ainsi de suite. Est-il possible que je puisse faire une jointure entre toutes ces tables avec une sorte de caractère générique pour le préfixe jibs -prefix?

Par exemple:

SELECT * FROM 'jibs*_posts';

PS Désolé s'il s'agit d'un doublon, mais je n'ai trouvé aucune solution.

P.P.S Ceci est un multisite WordPress


4 commentaires

Non. Vous pouvez corriger votre modèle de données en ayant une table, jibs_posts , qui combine les données de ces sous-tables.


Pourquoi avez-vous toutes ces tables? Une table jibs_post commune ne serait-elle pas meilleure?


Le réseau multisite @jarlh Wordpress semble créer ce désordre


@RiggsFolly Probablement, a repris un projet WP pour la dernière mise à jour en 2008 ...


4 Réponses :


1
votes

Ce n'est pas possible avec SQL, mais il existe des approches alternatives.

S'il y a une bonne raison d'abandonner les tables multiples (c'est-à-dire si le modèle de données serait satisfait par une seule table commune), vous pouvez poursuivre une conversion unique des multiples tables en une seule table.

S'il y a une bonne raison de conserver les multiples tables (c'est-à-dire s'il y a quelque chose dans votre modèle de données, ou une contrainte logistique, qui dicte une telle disposition), alors c'est une bonne situation pour combiner des outils. Plus précisément, vous pouvez utiliser votre langage de programmation ou de script préféré pour générer le SQL qui référence toutes les tables, puis utiliser ce SQL généré.

De nombreux langages de programmation vous permettraient à la fois de générer le SQL et de l'utiliser dans le même programme, via des liaisons de base de données.

MODIFIER : je vois que vous avez ajouté la balise wordpress (j'ai commencé à rédiger ma réponse avant qu'elle ne soit là), donc je ne sais pas à quel point mon la réponse s'applique. Autrement dit, je ne suis pas sûr du niveau d'accès dont vous disposez pour interagir directement avec la base de données. Si vous êtes contraint par ce que Wordpress requiert et / ou par la manière dont Wordpress vous permet d'exécuter le SQL que vous souhaitez exécuter, ma réponse générique MySQL / SQL pourrait ne pas vous aider.

Néanmoins, mon conseil général serait d'aborder le problème avec tous les outils que vous avez dans votre boîte à outils et d'envisager une approche combinant les forces, car SQL ne prend pas en charge les caractères génériques pour les noms de table.


1 commentaires

J'ai accès à la base de données, mais un tel refactor serait trop volumineux pour le moment



1
votes

Vous pouvez faire quelque chose comme ceci

SELECT * FROM jibs_posts
UNION
// ... more SELECTS
UNION
SELECT * FROM jibsX_posts;

cela listera toutes les tables avec ce schéma de nommage.

Ensuite, vous pouvez concaténer toutes les tables (si elles ont le même nombre de colonnes) avec une UNION

SHOW TABLES LIKE 'jibs%_posts';


1 commentaires

Ce serait probablement trop difficile à maintenir car plus de tables seront ajoutées assez fréquemment



2
votes

1- Récupérez les noms de vos tables:

PREPARE stmt1 FROM @sql
EXECUTE stmt1
DEALLOCATE PREPARE stmt1;

2- Créez une requête dynamique en boucle.

declare @counter = 1
declare @sql nvarchar(max);
declare @temptable nvarchar(100);
declare @limit int = (select count(*) from JibsTables)

while @counter <= @limit
begin
   set @temptable = select table_name from JibsTables where num = @counter

   if @counter <> @limit
   begin
      set @sql = @sql + ' select * from ' + @temptable + ' union'
   end
   else
   begin
      set @sql = @sql + ' select * from ' + @temptable + ';'
   end

   set @counter = @counter + 1
end

3- Exécutez votre dynamique query

declare @row_number int = 0;

CREATE TEMPORARY TABLE JibsTables (table_name varchar(50), num int)

INSERT INTO JibsTables (table_name, num)
SELECT table_name, (@row_number:=@row_number + 1) AS num
FROM information_schema.tables 
WHERE table_schema='your_database_name'
  AND table_name like 'jibs%'

Je connais bien la syntaxe MSSQL, j'ai fait de mon mieux pour trouver la syntaxe correcte pour mysql, mais la logique est claire, je crois. J'espère que tout va bien, merci de me le faire savoir.


4 commentaires

Je ne parviens pas à recevoir les noms de table de ma base de données à l'aide de la première requête. La table temporaire JibsTables retourne vide


Doit être un pourcentage % au lieu d'un astérisque *


@Jesper pouvez-vous réessayer maintenant? assurez-vous que la requête de sélection renvoie l'ensemble de résultats


Et mieux utiliser 'jibs% posts' comme modèle.



2
votes

Une autre alternative. Si de nouvelles tables jibs ne sont pas ajoutées trop fréquemment, vous pouvez créer une vue qui les UNION toutes ensemble, puis écrire vos requêtes par rapport à la vue. De cette façon, vous n'avez besoin de faire la saisie fastidieuse qu'une seule fois.

Si la mémoire est bonne (cela fait un moment que je n'ai pas joué sur un site Wordpress), vous devriez être en mesure d'ajouter l'objet nécessaire à la base de données.

Quelque chose comme:

CREATE VIEW v_jibs_posts AS
  SELECT <column_list> FROM jibs1_posts
  UNION
  ...<SELECTS from all the tables>
  UNION
  SELECT <column_list> FROM jibs<n>_posts

Ensuite, ajoutez simplement un UNION supplémentaire à la vue lorsque de nouvelles tables sont créées par l'application.

/ p>

Bien sûr, s'ils apparaissent fréquemment, ce serait trop compliqué à gérer.

Modifier : si vous vouliez avoir de la fantaisie, vous pourriez utilisez le SQL dynamique d'Eray Balkanli pour générer une instruction ALTER VIEW afin de sélectionner de nouvelles tables, puis planifiez-la pour qu'elle s'exécute périodiquement.


2 commentaires

Malheureusement, ils seront ajoutés assez fréquemment, ce sera donc trop difficile à maintenir


J'étais en train de taper une modification lorsque vous avez commenté qui pourrait soulager une partie des problèmes de maintenance, en fonction de votre tolérance pour les données éventuellement manquantes en interrogeant la vue entre les mises à jour.