Vous n'êtes pas identifié(e).
Pages :: 1
Bonjour,
Je crois que je mets un problème classique, mais tanpis !
[code mysql]
SELECT
CASE WHEN EXISTS
(
SELECT
COUNT( * )
FROM
wei
WHERE
id_eleve = ".$this->IdEleve."
)
THEN
(
UPDATE wei SET bus = 87 WHERE id_eleve = ".$this->IdEleve."
)
ELSE
(
INSERT INTO wei (bus, id_eleve) VALUES (87, ".$this->IdEleve.")
)
END
[/code]
Ca ne fonctionne pas.
Ce qui ne semble pas aller, c'est la "sous-requête" INSERT ou UPDATE.*
J'ai regardé sur le web : http://dotnettipoftheday.org/tips/updat … w-sql.aspx : je n'arrive pas à le faire fonctionner
Merci !
Dernière modification par moijhd (14-07-2010 16:16:49)
Hors ligne
J'ai aussi trouvé ça :
[code mysql]
INSERT INTO table (cle,blabla) VALUES (1337,'truc') ON DUPLICATE KEY UPDATE blabla='truc';
[/code]
qui fonctionne pour le coup.
Mais, cela m'oblige à rechercher la clé. Et sachant que ma clé est autoincremente je ne vois pas très bien comment construire la requête ?
Qu'en pensez vous ?
Hors ligne
La table wei a les champ suivants (id (auto), bus, id_eleve).
Je fais une recherche sur id_eleve.
Hors ligne
Peux-tu nous donner le résultat d'un SHOW CREATE TABLE wei
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
C'est ce que j'allais faire :
[code mysql]
--
-- Structure de la table `wei`
--
CREATE TABLE IF NOT EXISTS `wei` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_eleve` int(11) NOT NULL,
`bus` tinyint(1) NOT NULL,
`acompte` tinyint(1) NOT NULL,
`paye` tinyint(1) NOT NULL,
`date_acompte` datetime NOT NULL,
`date_paye` datetime NOT NULL,
PRIMARY KEY (`id`)
)
[/code]
Hors ligne
Il n'y a donc aucun index ni aucune contrainte sur la colonne `id_eleve`, qui semble pourtant être une clé étrangère.
Mais le moteur (ENGINE) de la table n'étant pas précisé, il doit s'agir d'une table MyISAM et non InnoDB.
Il n'y a donc pas d'UNICITE déclarée sur la colonne `id_eleve`.
Quelle est la requête INSERT que tu essayes d'appliquer sur cette table wei ?
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
J'ai rusé pour résoudre mon problème, je passe la clé primaire (c'est de toute façon mieux et plus facile) et j'utilise ON DUPLICATE KEY :
[code mysql]
INSERT INTO
wei
(
id,
bus,
id_eleve,
paye
)
VALUES
(
'".$this->Id."',
'".$this->Bus."',
'".$this->IdEleve."',
1
)
ON DUPLICATE KEY
UPDATE
bus = '".$this->Bus."' ,
paye = 1
[/code]
$this->Id peut être vide : du coup, cela fait un INSERT avec AUTOINCREMENT. Sinon, ça fait UPDATE.
Le fait est que je voudrais bien savoir pourquoi ma première avec le CASE ne fonctionne pas.
Dernière modification par moijhd (14-07-2010 21:38:54)
Hors ligne
Bonjour,
Juste pour info, il faut savoir qu'ici l'insert n'est pas provoqué uniquement sur un $this->Id vide mais sur toute valeur qui n'est pas déjà éxistante dans la base de données. un $this->Id vide permet uniquement de bénéficier de l'auto_increment.
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Je m'arrange pour que $this->Id une valeur existante ou rien :s
Dernière modification par moijhd (15-07-2010 06:21:00)
Hors ligne
Bonjour,
Je crois que je mets un problème classique, mais tanpis !
SELECT
CASE WHEN EXISTS
(
SELECT
COUNT( * )
FROM
wei
WHERE
id_eleve = ".$this->IdEleve."
)
THEN
(
UPDATE wei SET bus = 87 WHERE id_eleve = ".$this->IdEleve."
)
ELSE
(
INSERT INTO wei (bus, id_eleve) VALUES (87, ".$this->IdEleve.")
)
END
Pourquoi faire simple si l'on peut faire compliqué
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Justement, la requête écrite directement comme ça ne fonctionne pas !
Hors ligne
Bonjour,
Il faut savoir quand même que "ON DUPLICATE KEY UPDATE" est spécifique à l'instruction INSERT et uniquement à l'instruction INSERT et permet donc EXCEPTIONNELLEMENT au sein de la même requête de transformer une requête INSERT en UPDATE dans un cas bien précis. Donc relis bien ton manuel mySQL et tu verras qu'une requête MySQL consiste SOIT à rechercher des informations via SELECT, SOIT à mettre à jour des infos via UPDATE, SOIT ajouter des infos via INSERT (pour l'essentiel) avec un moteur myISAM.
On veut bien t'aider, enfin, en ce qui me concerne, à la condition que tu fasses au moins l'effort de comprendre ce que tu écris et ce que tu essayes de faire, car je le rappele, nous on est obligé de le faire pour te répondre d'une manière avisée et cohérente. Il me parait donc normal que tu en fasses autant pour le moins.
Bonne continuation.
Dernière modification par Jc (16-07-2010 21:29:05)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Ok !
Cela ne m'aide pas à comprendre comment me passer de ON DUPLICATE KEY UPDATE pour faire l'une ou l'autre de mes requêtes et pourquoi le CASE tel que je l'écris ne fonctionne pas.
Je n'ai jamais dis non plus que j'étais convaincu par cette "ruse", mais je n'ai pas trouvé pour le moment d'autres solutions.
Sinon, je résous ce problème en deux requêtes indépendantes, mais ce n'est pas mon but. Mon but, c'est d'apprendre du SQL. J'essaie donc.
Dernière modification par moijhd (16-07-2010 22:05:11)
Hors ligne
Re bonjour,
Je viens de te l'expliquer pourtant : tu ne peux pas dans une instruction select faire de l'insert ou de l'update ni les deux. SOIT du fait du select, SOIT du fait de l'update, SOIT tu fait de l'insert. Essayer de faire du PHP en MySQL ne fonctionnera jamais, MySQL n'est pas conçu pour ça.
Peut pas être plus explicite hein. J'aurais du aussi rajouter "que tu essayes de comprendre ce que l'on te réponds". Donc si tu ne comprends pas (tu en as le droit), dis le, on te réexplique autrement, mais ne dit pas que nos réponses ne t'aident en rien. Car si tu es en mesure de juger de la qualité/pertinence de nos réponses, c'est que par conséquent tu es capable et en mesure de trouver les réponses à tes questions par toi même.
Je te laisse y réfléchir
PS: de plus dans la requête de ton premier post, quand tu ecris
la particularité d'une telle écriture (utiliser COUNT()) fait que même si l'ideleve n'existe pas ta requête retournera un enregistrement malgrès tout avec count(*)=0. Par conséquent, tester si une telle requête existe est obsolète et sera toujours vrai. D'autre part, je te laisse consulter la doc MySQL et vérifier sur PHPmyAdmin ton utilisation de EXISTS dans cette requête.
Dernière modification par Jc (16-07-2010 23:15:11)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Vu pour le SELECT SELECT / INSERT / UPDATE...je n'y avais as pensé...ou n'avais donc pas compris.
Mon test avec EXSTS doit être un copier-collle loupé.
Mais je ne peux pas commencer une requête par un CASE directement non plus.
Hors ligne
>>Mais je ne peux pas commencer une requête par un CASE directement non plus.
bah oui, tu peux
a++
Hors ligne
Bonjour,
Travaillant toujours en production avec un serveur 5.0, à ma connaissance ce que je vais dire maintenant reste d'actualité en v5.5 mais peut être pas en 6.0 . Donc si il y a des commentaires à ce que je vais dire maintenant n'hésitez pas^^.
J'ai l'impression donc que tout le monde mélange l'utilisation de CASE. En MySQL, il existe :
1) Une déclaration CASE
2) Un Opérateur de contrôle de flux de données CASE.
Dans le 1er cas, CASE peut en effet commencer la requête ou presque dans la mesure où la déclaration CASE ne peut s'utiliser qu'au sein d'une procédure stockée comme suit (je reprends l'exemple du manuel)
Dans ce cas donc, la déclaration CASE se termine par END CASE.
2) Dans le 2e cas, CASE en tant qu'opérateur ne peut débuter une requête et s'utilise comme suit:
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
Il s'utilise qu'au sein d'une déclaration SELECT^^. Ici de plus L'opérateur CASE se termine par END.
Dernière modification par Jc (21-07-2010 18:39:02)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Pages :: 1