conditions sur la valeur d'une variable X donné par "as

Petit nouveau ! | 9 Messages

17 août 2005, 13:38

J'ai créé une requête qui contient un calcul que je place dans proximite grace a as. Jusque la pas de probleme. Cependant j'aurais souhaité pouvoir faire un test sur la proximité ainsi calculer et placer dans as, mais comme je pouvais m'y attendre, mysql n'apprécie guère mon test

Code : Tout sélectionner

Champ 'proximite' inconnu dans where clause
La requete est de ce style :
select  --  as proximite  from Communes_fr where proximite <=100
Y a t il une solution pour faire cela ?


De plus j'aurais aimé savoir s'il était possible dans un INSERT INTO de tester les doublons comme on le ferait dans un LOAD DATA INFILE avec IGNORE ou REPLACE en cas de doublons car je souhaite faire une INSERT INTO a partir d'un select, mais éviter les doublons bien evidement ( en fait vu la taille et l'importance des requetes j'ai peur d'un plantage que je voudrais prévenir en permettant de reprendre a partir d'un certain point. Je sais comment reprendre le probleme est simplement que pour l'endroit X ou je reprends des données ont p-e deja ete ajouté, et que voulant eviter les doublons je peux soit les supprimer avant de relancer l'autre requete, ce que je trouve un peu bourrin, soit trouver une solution pour eviter les doublons )

Merci de votre aide précieuse :)

Eléphant du PHP | 55 Messages

17 août 2005, 13:55

Pour la première question, il récupère les as du SELECT en dernier lieu, essaye donc dans ta condition d'utiliser le nom réel du champ.

Pour la deuxième, MySQL gère les doublons et retourne une erreur si tu as défini une clé primaire dans la table, tu peux alors faire un if en cas d'erreur, et te servir de la variable de retour de l'erreur :wink: .

Petit nouveau ! | 9 Messages

17 août 2005, 14:06

Pour la premiere question,le probleme est que c'est un calcul qui va dans proximité, et d'apres ce que j'ai testé, on ne peut pas mettre non plus le calcul devant le test ( et ca serait p-e un peu bourrin :?)

Pour la deuxieme question, le probleme est que je veux faire un INSERT de toutes les lignes qui correspondront a mon SELECT de maniere automatique ( donc des dizaines et dizaines de lignes ). Je ne veux pas faire de boucle pour inserer mais simplement utiliser une requete de ce type :
INSERT INTO proximite SELECT v_nom FROM Communes_fr
Donc l'erreur stopperait l'insertion mais je ne vois pas réellement comment l'utiliser. C'est pourquoi j'aurais aimé savoir s'il existait quelques choses du meme type que dans LOAD DATA INFILE, qui permet d'ignorer sans faire d'erreur ( et sans ajouter evidement ) ou de replacer automatiquement.
En fait je veux pas des doublons mais je veux pas des erreurs non plus :roll:

Petit nouveau ! | 9 Messages

17 août 2005, 14:10

Bon en fait pour le calcul dans le where, c p-e possible je m'apercois que j'ai une erreur meme en enlevant le where... :?
On ne peut pas faire select (un calcul) as proximité from .. ?
 INSERT into Proximite_fr select 1001 as ville_ori, v_nom, v_cp, v_insee, (6366*acos(cos(46)*cos(v_Lat)*cos(v_long-4)+sin(46)*sin(v_lat))) as proximite from Communes_fr;
:?:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 août 2005, 14:45

Quelle est la dernière erreur ?
édition : en fait je viens de lire ta requête, qu'est-ce que tu essayes de faire avec un INSERT calcul AS machin FROM table ? :shock:

sinon pour l'autre question :
Si on spécifie le mot IGNORE dans un INSERT avec les valeurs de plusieurs lignes, chaque ligne qui qui ferait doublon avec une clé PRIMARY ou UNIQUE existante dans la table sera ignoré et ne sera pas insérée. Si on ne spécifie pas IGNORE, l'insertion est abandonnée si quelque ligne que ce soit fait doublon avec une clé existante. La fonction mysql_info() de l'API C permet de savoir combien de lignes ont été insérées dans la table.
=> Syntaxe de INSERT

Petit nouveau ! | 9 Messages

17 août 2005, 14:59

merci pour le ignore, j'avais meme pas reussi a le trouver moi :oops:

heu oui c'est clair que je peux largement me passer du AS la, vu que ca va dans l'autre table ( j'avais pensé a l'enlever pour le premier, pour le deuxieme pas puisque je pensais l'utiliser dans le where ) mais ca ca ne pose pas de probleme.
En fait l'erreur j'ai fini par la comprendre :oops: j'avais une colonne en trop qu'etait mon auto-incremente que je donnais pas pour les valeurs et donc ca buggait :oops:

Reste donc le probleme du where. Mettre directement le calcul va p-e fonctionner il n'y aurait pas de solution plus efficace ?

Petit nouveau ! | 9 Messages

17 août 2005, 15:05

Bon ca fonctionne et ca ne semble pas etre trop long merci.

Par contre je depasse le temps autorisé :?

Code : Tout sélectionner

Fatal error: Maximum execution time of 30 seconds exceeded in c:\program files\easyphp1-8\www\formulaire\ini\crea_table_prox.php on line 82
je sais qu'il y a "limit" qu'on peut mettre mais si j'ai bien compris il agit sur le nombre de reponse et la on parle en teme de temps.
Possible de changer la limite ? :cry:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 août 2005, 15:16

il y a LIMIT de MySQL : limite le nombre de résultats renvoyés
là c'est le temps maximum d'exécution qui est dépassé

tu peux modifier cette variable dans le php.ini : MAXIMUM_EXECUTION_TIME
qui est par défaut à 30

mais avant regarde s'il n'y aurait pas moyen d'optimiser ton script ;)

Invité
Invité n'ayant pas de compte PHPfrance

17 août 2005, 20:21

ben je pense pas qu'on puisse grandement optimiser.
Y a un if ( qu'il faut que j'enleve d'ailleurs, avec la requete qui va avec ), un while et pis vala ;)
En fait ce qui prend du temps c'est qu'il y a la bagatelle de 35000 requetes a faire ;) avec le calcul donné en plus ;)
J'avoue que je pensais meme que ca prendrait bcp plus de temps.
C'est pas gênant etant donné que le seul but est de me créer une table qui une fois qu'elle sera faite, bah elle sera fait ;) heureusement ca n'est pas une page de mon site ;)

Probleme résolu donc :)
Merci pour tous les conseils ! :)