2010-05-09 3 views
1

Dans mon but d'avoir une relation plusieurs-à-plusieurs dans ma base de données MySQL, je suis arrivé à un autre pont à construire.MySQL Beaucoup à plusieurs avec des clés uniques et Mettre à jour/Sélectionner si Existe autrement Insérer

Tables actuelles:
Utilisateurs (id, nom)
Tags (id, nom)
User_Tags (user_id, tag_id)

Voici le but:
Je voudrais avoir la capacité de prendre un tag par exemple: #fb et l'insérer dans ma base de données Tags qui a une contrainte unique sur name et si l'étiquette existe, je voudrais retourner est id

Je voudrais insérez tag.id et le user.id de l'utilisateur actuel dans User_Tags. Je n'ai pas de contraintes uniques sur la table User_Tags car j'aimerais pouvoir suivre les balises les plus couramment utilisées par l'utilisateur et les présenter dans une liste triée par fréquence d'utilisation.

Je développe actuellement ce projet en PHP en utilisant des instructions préparées.
En outre, les performances ne sont pas actuellement un problème car mon nombre d'utilisateurs est encore assez faible, mais il est en croissance constante et peut-être un problème à l'avenir.

Répondre

3

Vous pouvez utiliser les codes ON DUPLICATE KEY UPDATE et LAST_INSERT_ID(expr) de MySQL pour obtenir l'identificateur d'étiquette, qu'il ait été inséré ou qu'il l'ait déjà été, par ex.

INSERT INTO 
    Tags 
    (name) 
VALUES 
    (:name) 
ON DUPLICATE KEY UPDATE 
    id = LAST_INSERT_ID(id) 

et

INSERT INTO 
    User_Tags 
    (user_id, tag_id) 
VALUES 
    (:userid, LAST_INSERT_ID()) 
+0

Parfait; Y a-t-il un moyen de faire 'ON DUPLICATE KEY SELECT'? – Jayrox

+0

Quel serait le but? – VolkerK

+0

Je ne sais pas, peut-être que je suis sur l'optimisation; mais si je comprends bien, les lectures sont moins chères que les écritures. Donc, si je ne dois pas écrire, il serait préférable de simplement lire, non? – Jayrox

Questions connexes