Page 1 sur 2

Requête,pourquoi tu veux pas fonctionner

Posté : 23 mai 2006, 19:03
par theNoob!

Code : Tout sélectionner

$query= "DELETE FROM contenu_fac AS tab1 WHERE tab1.id_fac = ('SELECT tab2.num_fac FROM facture AS tab2 WHERE tab2.etat_fac = 'nonfacture' AND tab2.date_fac < ($aujourdhui - 604800)')";
Pourriez-vous m'aider,je désespère

Posté : 23 mai 2006, 19:13
par Belinda92
C 'est bizarre ça me semble correct pourtant...

Je vois vraiment pas,désolé !!!

Posté : 23 mai 2006, 22:52
par Truc
Salut,

Tu aurait pu donner le message d'erreur qui te faire dire que celà ne fonctionne pas :wink:

Mais je dirais qu'il y a déjà une erreur au niveau des apostrophes encapsulant la sous requête.

Posté : 23 mai 2006, 22:55
par albat
Essaie en virant les apostrophes qui délimitent ta sous-requête...
$query= "DELETE
         FROM   contenu_fac AS tab1
         WHERE  tab1.id_fac = (SELECT tab2.num_fac
                               FROM   facture AS tab2
                               WHERE  tab2.etat_fac = 'nonfacture'
                                 AND  tab2.date_fac < ($aujourdhui - 604800))";

Posté : 24 mai 2006, 09:58
par zeus
En complément de ce qu'on dit mes collègue, je voudrais te rappeller que les sous-requetes pour MySQL ne sont gérées que depuis MySQL 4.1 ;)

Posté : 24 mai 2006, 16:03
par theNoob!
Sorry!
J'ai fait les modifs de albat, mais l'erreur existe encore...

Code : Tout sélectionner

Erreur de syntaxe près de 'WHERE tab1.id_fac = (SELECT tab2.num_fac ' à la ligne 3

Posté : 24 mai 2006, 16:06
par albat
As-tu vérifié si ta sous-requête SELECT te retourne bien un enregistrement et un seul ?

Si cette requête retourne plusieurs enregistrements,
remplace : WHERE tab1.id_fac = (SELECT
par : WHERE tab1.id_fac IN (SELECT

Posté : 28 mai 2006, 23:25
par theNoob!
Bon ben je désepère, ça me fait toujours la même erreur:

Erreur de syntaxe près de 'WHERE tab1.id_fac IN (SELECT tab2.num_fac ' à la ligne 3

je redonne la requête, peut-être que quelqu'un pourra me dire d'où ça vient:

Code : Tout sélectionner

$query= "DELETE FROM contenu_fac AS tab1 WHERE tab1.id_fac IN (SELECT tab2.num_fac FROM facture AS tab2 WHERE tab2.etat_fac = 'nonfacture' AND tab2.date_fac < ($aujourdhui - 604800))";

Posté : 28 mai 2006, 23:34
par Truc
Le message d'erreur débute juste avant le WHERE il manque peut être un espace à cet endroit entre l'alias et WHERE.

Posté : 28 mai 2006, 23:35
par albat
:idea: TROUVÉ !

1. Il faut extraire les variables PHP des chaînes de caractères, c'est plus propre.

2. Si ta variable $aujourdhui a pour valeur 704800,
la requête qui va être générée contiendra la clause
AND  tab2.date_fac < (704800 - 604800)
au lieu de :
AND  tab2.date_fac < 100000
Ceci devrait mieux fonctionner...
$query= "DELETE
         FROM   contenu_fac AS tab1
         WHERE  tab1.id_fac IN (SELECT tab2.num_fac
                                FROM   facture AS tab2
                                WHERE  tab2.etat_fac = 'nonfacture'
                                  AND  tab2.date_fac < ".($aujourdhui - 604800).")";

Posté : 28 mai 2006, 23:37
par albat
Y a quand même un truc qui me chiffonne... J'suis pas sûr à 300% de ma solution... :-k :ordi:

Posté : 28 mai 2006, 23:39
par albat
Et en virant les retours chariot ?
$query = "DELETE FROM contenu_fac AS tab1 WHERE tab1.id_fac IN (SELECT tab2.num_fac FROM facture AS tab2 WHERE tab2.etat_fac = 'nonfacture' AND tab2.date_fac < ".($aujourdhui - 604800).")";

Posté : 28 mai 2006, 23:52
par theNoob!
Nan désolé toujours rien :(

Posté : 28 mai 2006, 23:52
par Hubert Roksor
Le problème vient certainement de l'alias, donc il faut retirer le "AS tab1" et "tab1."

De plus, il vaudrait mieux utiliser un DELETE multi-table en réécrivant la sous-requête sous la forme d'une jointure pour des raisons de performances.

Posté : 28 mai 2006, 23:56
par theNoob!
C'est bon ça marche !!! :D

J'ai simplement supprimé tab1 et AS tab1