[mysql] Limiter un INSERT INTO suivant le nombre d'occurence

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [mysql] Limiter un INSERT INTO suivant le nombre d'occurence

par Phil.Antrope » 18 août 2007, 00:08

La structure est très simple :

Code : Tout sélectionner

-- -- Structure de la table `user_fav` -- CREATE TABLE `user_fav` ( `user_id` varchar(255) NOT NULL, `serie_id` varchar(20) NOT NULL, `team_id` varchar(20) NOT NULL )
Et voici les contraintes :
Chaque série est potentiellement sous-titrée par plusieur team,
j'aimerai donc que l'utilisateur puisse choisir un maximum de 5 séries différentes, chaque série pouvant contenir 5 teams différentes maximum
un exemple de donnée d'utilisateur correct :

Code : Tout sélectionner

user_id, serie_id, team_id USER_58887, SERIE_4444, TEAM_0555 USER_58887, SERIE_4444, TEAM_0112 USER_58887, SERIE_4444, TEAM_0334 USER_58887, SERIE_4444, TEAM_0888 USER_58887, SERIE_4444, TEAM_0999 USER_58887, SERIE_9999, TEAM_0666 USER_58887, SERIE_9999, TEAM_0555

par Sékiltoyai » 17 août 2007, 22:51

Tu peux donner la structure de toutes les tables concernées et toutes les contraintes que tu fixes ?

par Phil.Antrope » 17 août 2007, 22:05

Dans ce cas ci il s'agit des séries sous-titrées par des teams de sous-titrages, d'où les 2 champs, j'aimerai si possible garder cette structure, je vais réfléchir à un autre moyen.

par Sékiltoyai » 17 août 2007, 03:22

C'est quoi les series et teams ? Tu devrais peut être changer l'organisation de tes données…

par Phil.Antrope » 17 août 2007, 02:02

Oui mais ça ne limitera pas le nombre de team par série à 5 qui est le maximum que j'aimerai allouer.

par Sékiltoyai » 17 août 2007, 00:58

Bah non, tu fais pareil que tout à l'heure, mais avec 25 au lieu de 5…

par Phil.Antrope » 16 août 2007, 23:42

Tant que j'y suis, je peux me permettre encore une petite question ?

Comment je fais la même chose mais en limitant l'ajout des valeurs avec 2 conditions ?

J'ai, par exemple, 3 champs : user_id, serie_id, team_id

et je voudrais limiter le nombre global de favoris d'un user précis à 5 serie_id différent,
chaque serie_id pouvant avoir 5 team_id différent chacun...

Je sais pas si je suis assez clair. En gros ça me donnerait, par exemple dans la table :

user_id = 5, serie_id = 10, team_id = 12
user_id = 5, serie_id = 10, team_id = 62
user_id = 5, serie_id = 10, team_id = 78
user_id = 5, serie_id = 10, team_id = 64
user_id = 5, serie_id = 25, team_id = 15
user_id = 5, serie_id = 25, team_id = 99

Donc en tout globalement le user disposerait de 25 row maximum (5 series x 5 team chacunes)
Bêtement dans mon élan de brute j'avais mis ceci :

Code : Tout sélectionner

INSERT INTO user_fav (user_id,serie_id,team_id) SELECT "IDUSER", "IDSERIE", "IDTEAM" FROM user_fav WHERE (user_id="IDUSER" GROUP BY user_id HAVING COUNT(user_id)<5) AND (user_id="IDUSER" GROUP BY serie_id HAVING COUNT(serie_id)<5)
Mais bon, bien sur ça marche pas :lol:

par zeus » 16 août 2007, 19:41

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

par Phil.Antrope » 16 août 2007, 18:53

Effectivement, du coup ça marche mieux :lol:

Merci :wink:

par Sékiltoyai » 16 août 2007, 18:30

Mets des quotes à tes valeurs.

par Phil.Antrope » 16 août 2007, 18:26

Quand j'essaie

Code : Tout sélectionner

INSERT INTO user_fav( user_id, serie_id, team_id ) SELECT user_id, favori0001 FROM user_fav WHERE user_id = user0001 GROUP BY user_id HAVING COUNT( user_id ) >5
Mysql me répond :

#1054 - Unknown column 'favori0001' in 'field list'

Comment y mettre des valeurs sont forcément faire référence à une table existante ?

par Sékiltoyai » 16 août 2007, 17:43

Bah si tu veux faire tout en même temps, c'est :

Code : Tout sélectionner

INSERT INTO table (user_id,user_favori) SELECT user_id, favori0001 FROM table GROUP BY user_id HAVING COUNT(user_id)>5
Au passage, ca marche aussi pour un seul utilisateur :

Code : Tout sélectionner

INSERT INTO table (user_id,user_favori) SELECT user_id, favori0001 FROM table WHERE user_id=user0001 GROUP BY user_id HAVING COUNT(user_id)>5

par Phil.Antrope » 16 août 2007, 17:14

Potentiellement c'est pour tous les utilisateurs (genre 10 000).
Chaque utilisateur pouvant avoir jusqu'a 5 favoris maximum.

par Sékiltoyai » 16 août 2007, 16:56

Je pensais plutôt à un cas de figure où mysql_affected_rows() retournerais 0 :?
Ouais mais je ne vois pas trop dans quels cas critiques il pourrait avoir un affected_rows à 0 mis à part bien sur s'il y a trop de favoris.

@Phil.Antrope : Tiens, d'ailleurs, c'est pour un seul utilisateur ou bien pour tous que tu veux le faire ?

par Phil.Antrope » 16 août 2007, 16:54

Merci pour vos réponses,

En fait ma question était plus théorique qu'autre chose, la méthode que j'utilise actuellement implique bien un SELECT avant l'INSERT, je me posais juste la question de savoir si c'était possible, mais je n'avais effectivement pas pensé au rapport d'erreur éventuel.