[RESOLU] Requete de 2 Select avec Union ne marche pas

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 : [RESOLU] Requete de 2 Select avec Union ne marche pas

Re: Requete de 2 Select avec Union ne marche pas

par sandy2626 » 23 janv. 2016, 20:03

Merci a tous.
Moi aussi Ryle je pensais comme toi mais étrangement la requête écrite telle que le propose Saian avec les parentheses positionnées comme ca (A ET B) OU C marche parfaitement elle me donne bien les résultats qui correspondent aux 2 select si je les lancais séparés et elle marche aussi dans ma routine php. Donc je suis contente. Je ne trouve pas d'explication ca serait bien quand meme de comprendre mais bon ca me permet d'avancer dans mon travail et je vous en suis tres reconnaissante.
Sinon pour le traçage et le déboggage je ne sais pas encore tres bien faire. J'espere me perfectionner rapidement grace en partie a votre aide. :wink:

Re: Requete de 2 Select avec Union ne marche pas

par Ryle » 22 janv. 2016, 18:58

@Saian : en fait, dans le cas présent les parenthèses ne sont pas nécessaire du fait de la préséance des opérateurs. Les conditions AND sont traitées en priorité sur les OR (comme la multiplication est traitée en priorité sur l'addition :))

Ainsi "A ET B OU C" équivaut implicitement à "(A ET B) OU C". En revanche, si la condition A obligatoire et que l'une ou l'autre des conditions B ou C conviennent, il faudra le spécifier explicitement : "A ET (B OU C)" d'où la grande parenthèse qui entoure ces 3 conditions et qui elle est indispensable :)

Les parenthèses sont donc importantes pour gérées les conditions OU que l'on souhaite prioriser par rapport à des ET. C'est ensuite une question d'habitude, certains diront qu'elles facilitent la compréhension (et effectivement, il n'y a pas de doute à avoir sur le traitement effectué), d'autres qu'elles surchargent la lecture... Bref, on peut les mettre ou non, le truc c'est de les utiliser à bon escient ;)

Re: Requete de 2 Select avec Union ne marche pas

par Saian » 22 janv. 2016, 14:01

Salut, je garantie rien mais je crois que c'est pas impossible que le résultat change si tu encapsules month et year dans des parenthèses comme ceci :

Code : Tout sélectionner

AND ((month=" . $mois . " AND year=" . $annee . ") OR month=0)
Ainsi pour le month=0 l'année ne devrait pas être filtrée.

Re: Requete de 2 Select avec Union ne marche pas

par sandy2626 » 22 janv. 2016, 13:50

Merci Ryle pour toutes tes explications et ta patience :wink:

J'avais en effet essayé la requête avec le OR sur la colonne "month" mais ca m'avait donne un resultat incorrect. Je pensais alors que la requête n'était pas bien écrite. Mais apparement le probleme venait d'ailleurs.
Je vais essayer de nouveau et je te tiens au courant.

A plus...

Re: Requete de 2 Select avec Union ne marche pas

par Ryle » 22 janv. 2016, 11:29

Bonjour,

Pour mettre ton code en forme sur le forum, il te suffit d'utiliser les balises [ php ] [ /php ] sans les espaces, (ou balises css, ou sql, ... en fonction de ce que tu veux mettre en forme :))

Pour ton soucis, l'information "ça ne marche pas" n'a jamais permit de corriger un problème, c'est pour ça que php ou mysql retournent des messages d'erreur pas toujours très explicites, mais quand même bien utile pour identifier l'origine du problème :)

Dans l'idée, lorsque tu as un soucis avec une requête SQL, il est effectivement intéressant de tester le résultat de l'exécution et d'afficher la requête que tu veux faire exécuter. Ca permet déjà de voir si ce que tu envois à mysql est bien structuré :
$sql = " SELECT ... "; // on écrit la requête
$query = mysql_query($sql) or ; // on execute la requête 
if (!$query) { // on vérifie s'il y a eu une erreur
  echo '<br />' . mysql_error(); // le cas échéant on affiche le message d'erreur retourné par MySQL
  echo '<br />' . $sql; // on contrôle la requête envoyée
}
A noter par ailleurs que tu exécutes deux fois la même requêtes sur les mêmes tables, avec les mêmes champs, simplement avec des conditions différentes. Dans ce cas il n'est pas nécessaire de faire un UNION, il suffit simplement d'ajuster la condition dans le WHERE :
$sql = "SELECT workers.nom as Nom, day as Jour, day_month as Le, month as Mois, year as Annee, start as Debut, end as Fin
                      FROM worktimes ,workers
                        WHERE workers.id=" . $idworker . " 
                        AND workers.id=worktimes.idworker
                        AND worktimes.is_active=1 
                        AND ( month=" . $mois . " AND year=" . $annee . " OR month=0)
                  ORDER BY Nom,Le,Jour,Mois,Annee"
Ici on va ramener tous les enregistrement du mois/année spécifié ou ayant un mois égal à 0

A noter enfin qu'il est plutôt recommandé d'utiliser un seul champ de type date (pour lequel on pourra utiliser toutes les fonctions concernant les dates) que de découper cette information dans plusieurs champs de type int ou varchar (encore que ça dépend du contexte et du besoin, mais d'une manière générale, c'est quand même plus pratique ;))

Re: Requete de 2 Select avec Union ne marche pas

par sandy2626 » 22 janv. 2016, 01:02

salut or,

tu veux dire en utilisant un echo ?

Re: Requete de 2 Select avec Union ne marche pas

par or 1 » 22 janv. 2016, 00:45

il faudrait afficher la requete générée par ce code et la comparer avec celle qui fonctionne dans phpmysql, pour détecter la différence.

Requete de 2 Select avec Union ne marche pas

par sandy2626 » 22 janv. 2016, 00:24

Bonsoir les amis du forum,
Je me resigne a venir solliciter votre aide je suis en effet confrontée a un probleme et j'ai pas réussi a m'en sortir malgré le temps passe dessus.
J'explique.
J'ai une requête constituée de 2 select avec union et ca ne fonctionne pas. Quand je separe les select ca marche mais des que je les mets en union ca ne marche pls. Ma requête avec UNION fonctionne bien sur phpmysql mais dans le php ca ne marche pas.

Voila le bout de code :
$query = mysql_query ( "SELECT workers.nom as Nom,
											 day as Jour,
											 day_month as Le,
											 month as Mois,
											 year as Annee,
											 start as Debut,
											 end as Fin
											FROM worktimes ,workers
												WHERE workers.id='" . $idworker . "' 
												AND workers.id=worktimes.idworker
												AND worktimes.is_active='1' 
												AND month='" . $mois . "'
												AND year='" . $annee . "'
									UNION
										SELECT workers.nom as Nom,
											 day as Jour,
											 day_month as Le,
											 month as Mois,
											 year as Annee,
											 start as Debut,
											 end as Fin
										FROM worktimes ,workers
										WHERE workers.id='" . $idworker . "' 
										AND workers.id=worktimes.idworker
										AND worktimes.is_active='1' 
										AND month='0'
									ORDER BY Nom,Le,Jour,Mois,Annee" );
		
		while ( $datainfotravail = mysql_fetch_array ( $queryinfotravail ) ) {
                     ....traitement des données...
                  }
Quelqu'un voit-il un probleme dans ce code ?

Merci infiniment.

Désolée je ne sais pas encore comment mettre ce bout de code sur les fonds noirs :oops: