2009-08-28 7 views
0

Puis-je utiliser une fonction ou une procédure MySQL pour renvoyer les noms de tables pouvant être utilisés dans une requête?MySQL Fonction de renvoi du nom de la table à utiliser dans une requête

Quelque chose comme

SELECT * FROM get_db_table_name(2342352412);

get_db_table_name() est une fonction définie par l'utilisateur qui accepte une user_id en tant que paramètre et renvoie le db.table où l'utilisateur se trouve. Je n'ai pas pu le faire de cette façon car MySQL se plaint de la syntaxe (je suppose que c'est parce que j'ai dû définir un type de retour pour la fonction, que j'ai essayé comme VARCHAR(30) et c'est faux ou impossible). Alors, est-ce possible?

L'histoire est que j'ai quelques bases de données qui sont essentiellement des fragments. Appelons-les user_1, user_2, etc.

J'ai aussi une seule table, dire emails qui contient des enregistrements avec user_id s des tables user_1.users, user_2.users, etc.

Depuis que je connais un moyen de calculer laquelle une table id est juste en regardant l'id, je veux juste une fonction qui accepte une entrée et retourne un nom db.table à utiliser.

Merci!

P.S. Je voudrais utiliser la requête SELECT ci-dessus comme une définition VIEW qui amènerait le nom de l'utilisateur à partir de la table/base de données appropriée en effectuant une jointure à travers la table appropriée.

Répondre

2

Vous pouvez utiliser prepared statements pour cela, par exemple .:

.... 
SET @tbl = 'nameofmytable'; 
SET @sql = CONCAT('SELECT * FROM ', @tbl); 
EXECUTE @sql; 
... 
+0

Je ne pense pas que cela fonctionnerait dans une déclaration VIEW (voir le P.S. dans le message principal). Pouvez-vous fournir une définition VIEW où cela fonctionnerait? –

+0

Je dirais que concaténer CREATE VIEW à @sql n'est pas un problème non plus. – Zed

0

Lors de la définition d'une vue vous devez spécifier les tables. Vous ne pouvez pas définir une vue sur « SELECT DE whereever nécessaire » ...

La définition de la vue est « gelé » au moment de la création, de sorte que les modifications apportées aux tables sous-jacentes ensuite n'affectent pas la définition de la vue. Par exemple, si une vue est définie comme SELECT * sur une table, les nouvelles colonnes ajoutées ultérieurement à la table ne font pas partie de la vue.

Vous devez spécifier ma vue est sur ceci, ceci et cette table. En regardant cela, vous ne pouvez pas faire SELECT * FROM func (id) parce que vous ne pouvez pas spécifier les résultats de cette fonction (en fonction du paramètre d'entrée).

La syntaxe de SELECT est

SELECT * FROM table_references

La seule façon de "dynamique" SELECT est avec SQL dynamique, ce @Zed a répondu ...

I Je suis désolé si ma réponse est incomplète, mais je ne connais pas votre problème dans les détails. Bonne chance!

+0

Eh bien, l'idée est de montrer le nom de l'utilisateur, ce qui signifie que la vue doit savoir quelle table regarder. Jusqu'à présent, ma meilleure solution implique autant de JOINs GAUCHE que j'ai de tables utilisateur (dev n'en n'en a que 2, donc ça marche), puis une grosse instruction if qui met le nom de la table appropriée. J'aimerais le faire plus élégamment. –

Questions connexes