SYNTAXE sous-requête MySQL

Aurélien C.
Invité n'ayant pas de compte PHPfrance

07 mars 2007, 15:18

Bonjour,

Je suis sur le point de finaliser une requête MySQL contenant plusieurs sous-requête mais je n'arrive pas à faire en sorte que la SYNTAXE soit bonne.

Voici ma requête MySQL qui ne fonctionne pas :
<?php
$res_allauto=mysql_query("SELECT id,lu_msg_f,msg_f,sujet_f,expediteur_f,recepteur_f,date_f,typeMSG_f,typeENVOI_f,
typeSTATUT_f,formatMSG_f,dayweek_f,day_f,month_f,year_f,gotodate_nbr_f,gotodate_choix_f,optioninscri_f,optioninscriSPE_f,
$mbres4.id_tbc AS id_tbcEXP,
$mbres4.inscri_date_tbc AS inscriDateTBC_EXP
FROM $mbresPROSPECTS,$mbres4,$mbres9
WHERE $mbres4.login_tbc=$mbres9.expediteur_f
AND $mbres9.id='$id_msg_tblPREP'
AND id='$id_msg_tblPREP'


OR (
(SELECT
$mbres4.id_tbc AS id_tbcRECEP,
$mbres4.inscri_date_tbc AS inscriDateTBC_RECEP
FROM $mbres4,$mbres9
WHERE $mbres4.login_tbc=$mbres9.recepteur_f
AND $mbres9.id='$id_msg_tblPREP')

OR (SELECT
$mbresPROSPECTS.id_p AS id_pEXP,
$mbresPROSPECTS.date_p AS date_pEXP
FROM $mbresPROSPECTS,$mbres4,$mbres9
WHERE $mbresPROSPECTS.login_tbc_parrain=$mbres9.expediteur_f
AND $mbres9.id='$id_msg_tblPREP'
AND $mbresPROSPECTS.valid_p='1'
AND $mbresPROSPECTS.typeMSG LIKE'%, $typeMSG_f_tblPREP ,%'
".$req_type_recep.")
)

ORDER BY id");

while($res_ok_auto=mysql_fetch_array($res_allauto)){
}

/* Le WHILE ci-dessus me retourne cette ERREUR :*/

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/tonbusin/public_html/membre/admim_m/script_auto/send_msgauto.php on line 132

/*
Cela veux très certainement dire que ma requête MYSQL n'est pas bonne. Merci de me dire quel est le problème dans ma requête.

Note : les différentes tables sont représentées par des variables ($mbresXX. Ces tables sont bien existantes.
*/
?>
Merci beaucoup pour votre aide,
Cordialement,
Aurélien C.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 mars 2007, 15:36

Et si tu affichais la requête générée pour vérifier que toutes tes variables php fournissent bien les bonnes valeurs ?

Tu pourrais également en profiter pour l'executer dans MySQL (ou phpMyAdmin) et ainsi connaitre le message d'erreur et peut être en savoir plus sur l'endroit ou il se situe ? (tu peux aussi utiliser la fonction mysql_error() si tu préfères :))

Pis question bête, mais ta version de mysql autorise-t-elle les sous-requête ? (on sait jamais)

Euh rectification...

Je viens de relire la requête en question... La syntaxe n'est pas bonne du tout et tes sous-requêtes n'ont rien à faire là. Tu ne peux ramener les éléments d'un select en plein milieu des critères de ton autre requête. Si tu veux regrouper les résultats de tes 3 requêtes, il faut utiliser le mot clé UNION au lieu du OR.

Le SQL s'écrit comme on le parle : "Sélectionne les champs, dans les tables, pour lesquels ce champ a telle valeur et ce champ a telle valeur ou ce champ a telle valeur. "
Ce que tu fais ici ressemble à : "Sélectionne les champs, dans les tables, pour lesquels ce champ a telle valeur ou sélectionne les champs dans les tables" :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Aurélien C.
Invité n'ayant pas de compte PHPfrance

07 mars 2007, 16:15

Merci beaucoup pour ton aide.
J'ai essayer de faire tout ce que tu m'as dis.

Voici la requête exécutée :
SELECT id,lu_msg_f,msg_f,sujet_f,expediteur_f,recepteur_f,date_f,typeMSG_f,typeENVOI_f, typeSTATUT_f,formatMSG_f,dayweek_f,day_f,month_f,year_f,gotodate_nbr_f,gotodate_choix_f,optioninscri_f,optioninscriSPE_f, 
tbc_acces.id_tbc AS id_tbcEXP, 
tbc_acces.inscri_date_tbc AS inscriDateTBC_EXP 
FROM tbc_prospects,tbc_acces,tbc_chat 
WHERE 
tbc_acces.login_tbc=tbc_chat.expediteur_f 
AND tbc_chat.id='29886' 

UNION SELECT tbc_acces.id_tbc AS id_tbcRECEP, tbc_acces.inscri_date_tbc AS inscriDateTBC_RECEP FROM tbc_acces,tbc_chat WHERE tbc_acces.login_tbc=tbc_chat.recepteur_f 
AND tbc_chat.id='29886' 

UNION SELECT tbc_prospects.id_p AS id_pEXP, tbc_prospects.date_p AS date_pEXP FROM tbc_prospects,tbc_acces,tbc_chat WHERE tbc_prospects.login_tbc_parrain=tbc_chat.expediteur_f 
AND tbc_chat.id='29886' 
AND tbc_prospects.valid_p='1' 
AND tbc_prospects.typeMSG LIKE'%, MarketingInternet ,%' 
AND tbc_acces.statut_rad='1' ORDER BY id

Voici l'ERREUR obtenue avec mysql_error(); :
The used SELECT statements have a different number of columns
J'ai donc simplement remplacé les OR par des UNION dans ma requête et j'ai enlevé toutes les parenthèses.

J'espère que tu pourras m'aider afin d'arriver à un résultat sans erreur.
Merci bien,
Aurélien.

Aurélien C.
Invité n'ayant pas de compte PHPfrance

07 mars 2007, 16:16

J'oubliai : OUI ma version de MySQL autorise les Sous-requête. J'ai la version "4.1.10" de MySQL.

Aurélien

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

07 mars 2007, 16:18

Il faut avoir le même nmbre de colonnes dans le SELECT de ta requête et dans celui de ta sous-requête. Voilà ce que dit le message d'erreur.

NB : les OR sont super gourmands, à éviter si tu le peux :) préfère un IN()
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Aurélien C.
Invité n'ayant pas de compte PHPfrance

07 mars 2007, 16:36

Merci pour ta réponse. J'ai donc au final la requête MySQL suivante :
SELECT id,lu_msg_f,msg_f,sujet_f,expediteur_f,recepteur_f,date_f,typeMSG_f,typeENVOI_f,
typeSTATUT_f,formatMSG_f,dayweek_f,day_f,month_f,year_f,gotodate_nbr_f,gotodate_choix_f,optioninscri_f,optioninscriSPE_f,
$mbres4.id_tbc AS id_tbcEXP,
$mbres4.inscri_date_tbc AS inscriDateTBC_EXP
FROM $mbresPROSPECTS,$mbres4,$mbres9
WHERE $mbres4.login_tbc=$mbres9.expediteur_f
AND $mbres9.id='$id_msg_tblPREP'

UNION SELECT id,lu_msg_f,msg_f,sujet_f,expediteur_f,recepteur_f,date_f,typeMSG_f,typeENVOI_f,
typeSTATUT_f,formatMSG_f,dayweek_f,day_f,month_f,year_f,gotodate_nbr_f,gotodate_choix_f,optioninscri_f,optioninscriSPE_f,
$mbres4.id_tbc AS id_tbcRECEP,
$mbres4.inscri_date_tbc AS inscriDateTBC_RECEP
FROM $mbres4,$mbres9
WHERE $mbres4.login_tbc=$mbres9.recepteur_f
AND $mbres9.id='$id_msg_tblPREP'

UNION SELECT id,lu_msg_f,msg_f,sujet_f,expediteur_f,recepteur_f,date_f,typeMSG_f,typeENVOI_f,
typeSTATUT_f,formatMSG_f,dayweek_f,day_f,month_f,year_f,gotodate_nbr_f,gotodate_choix_f,optioninscri_f,optioninscriSPE_f,
$mbresPROSPECTS.id_p AS id_pEXP,
$mbresPROSPECTS.date_p AS date_pEXP
FROM $mbresPROSPECTS,$mbres4,$mbres9
WHERE $mbresPROSPECTS.login_tbc_parrain=$mbres9.expediteur_f
AND $mbres9.id='$id_msg_tblPREP'
AND $mbresPROSPECTS.valid_p='1'
AND $mbresPROSPECTS.typeMSG LIKE'%, $typeMSG_f_tblPREP ,%'
".$req_type_recep."

ORDER BY id

Est-ce que la requête est bonne ? Apparemment oui car je n'ai plus d'erreur MySQL MAIS je me demande si cette requête fait bien ce que j'ai envie de faire. Qu'en pensez-vous ?

Merci beaucoup pour votre aide,
Aurélien

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

07 mars 2007, 17:01


  1. <?php echo $req; ?>
  2. Tu fais tourner le programme
  3. Tu copies ta requête
  4. Tu la colles dans PHPMyAdmin/Eskuel/MySQL Query Browser/Autre
[/color]
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Aurélien C.
Invité n'ayant pas de compte PHPfrance

07 mars 2007, 18:15

OK merci bcp :) Tout à l'air de fonctionner.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

07 mars 2007, 19:02

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 [Mettre Résolu] 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 !!! ;)
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.