Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/02/2011, 08h46   #1
Invité de passage
 
Inscription : février 2011
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 11
Points : 0
Points : 0
Par défaut Accès table supplémentaire

Bonjour à tous,

J'écris ce petit mot car j'ai un petit soucis de requête. Pour un besoin x, j'ai codé une requête qui fonctionne très bien, générée dynamiquement par php. Hors je me suis décidé à ajouter un paramètre supplémentaire qui fait que la requête ne fonctionne plus. Voilà le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
		$statabsenteisme_req = "SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux
								FROM gm_arret AS ar 
								INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent
								INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent ";
 
		if($type == 'prolongation')
		{
 
		}
 
		else
		{
			$statabsenteisme_req .= " INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret ";
		}
[...]

[...]

Code :
1
2
3
4
5
6
7
		if($type == 'prolongation')
		{
			$statabsenteisme_req .= " OR ar.indice_prolongation ='1'";
		}
		$statabsenteisme_req .= " AND co.complet IN(1,2,3,4)";
		$statabsenteisme_req .= " ORDER BY ca.nom_agent ASC";	
		$statabsenteisme_sql = mysql_query($statabsenteisme_req);
Vous noterez que la table gm_complet selon le type n'est pas déclarée. Le problème c'est que je ne vois pas comment la rajouter pour que cela fonctionne.

Auriez vous une idée ? Merci par avance.

Cdt,

Tux
Cortux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 10h13   #2
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Il va falloir que tu nous montres ce qu'il y a entre les 2, ça vient sûrement de qu'il y a avant le 'OR' ....
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 10h21   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 707
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 707
Points : 3 277
Points : 3 277
Salut

- Soit tu répète la condition autant de fois que c'est nécessaire sur "prolongation" tout en respectant la structure de la requête.
Moins pratique à mon sens.

- Soit, (ce qui me semble mieux car ça offrira plus de souplesse quand on crée une requête dynamique) tu éclate les choses selon la structure de la requête.
Exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
$select = 'SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux ';
$from = 'FROM gm_arret AS ar ';
$join = 'INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent
INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent ';
$where = 'WHERE ';
$clause = '';
$order_by = 'ORDER BY ca.nom_agent ASC ';
//
 
if ($type == 'prolongation') {
    $join .= 'INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret ';
    $where = '... etc ...';
    $clause .= "OR ar.indice_prolongation ='1' ";
    $clause .= 'AND co.complet IN(1,2,3,4) ';
}
else {
   // ...Autres intégrations si c'est le cas ...
}
 
// Reconstitution des éléments
$sql = $select.$from.$join.$where.$clause.$order_by;
Quelque chose dans ce genre là, faut adapter selon les conditions.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 10h26   #4
Invité de passage
 
Inscription : février 2011
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 11
Points : 0
Points : 0
Pour faire plus court je vais afficher les deux requêtes.

Le premier choix qui fonctionne :

Code :
1
2
3
4
5
6
7
8
SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux 
FROM gm_arret AS ar 
INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent 
INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent 
INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret 
WHERE af.num_ucf = '1' 
AND co.complet IN(1,2,3,4) 
ORDER BY ca.nom_agent ASC
Le second choix :

Code :
1
2
3
4
5
6
7
8
SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux 
FROM gm_arret AS ar 
INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent 
INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent 
WHERE af.num_ucf = '1' 
OR ar.indice_prolongation ='1' 
AND co.complet IN(1,2,3,4) 
ORDER BY ca.nom_agent ASC
Dans le second cas, la table gm_complet n'est pas déclarée. D'où l'erreur mysql_num_rows(): supplied argument is not a valid MySQL result resource.

J'avais pensé à INNER JOIN gm_complet AS co sans ON mais ça ne fonctionne pas :/

Le passage intermédiaire de la requête a toujours fonctionné et est indépendant si je puis dire de mon problème. Cette partie manquante est assez conséquente, mais si ya vraiment besoin, je la poserai également.

Cdt
Cortux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 10h41   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 707
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 707
Points : 3 277
Points : 3 277
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$select = 'SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux ';
$from = 'FROM gm_arret AS ar ';
$join = 'INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent
INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent ';
$where = "WHERE af.num_ucf = '1' ";
$clause = '';
$order_by = 'ORDER BY ca.nom_agent ASC ';
//
 
if ($type == 'prolongation') {
    $join .= 'INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret ';
    $clause .= 'AND co.complet IN(1,2,3,4) ';
}
else {
    $clause .= "OR ar.indice_prolongation ='1' ";
 
    // Ici le co.complet cause problème.
    // Faut voir
    $clause .= 'AND co.complet IN(1,2,3,4)';
}
 
$sql = $select.$from.$join.$where.$clause.$order_by;
Effectué un peu vite fait, mais ça ne doit pas être trop loin.


Mais le "co.complet" cause problème dans la 2ème condition, la table "gm_complet" ne s'y trouve pas, or, dans ton exemple elle s'y trouve dans les 2 cas.
Faut faire le point la dessus.
Soit ce champ/clause, il ne faut pas rajouter dans ce cas là, soit ce champ "complet" peut être exploiter autrement, faut voir.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 16h10   #6
Invité de passage
 
Inscription : février 2011
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 11
Points : 0
Points : 0
Je suis navré RunCodePhp mais j'ai énormement de mal à procéder comme tu le fait. Ma requête étant assez monstrueuse, je suis pas sur de pouvoir adapter ta méthode à la requête.

Une petite question tout de même, peut être que ça eclairera sur le problème.

J'ai lu sur une page sql qu'il était possible d'accéder à deux tables de cette façon :

Code :
1
2
3
4
SELECT animal.nom,
    -> (TO_DAYS(date) - TO_DAYS(naissance))/365 AS age,
    -> remarque
    -> FROM animal, evenement
Est-ce que cette méthode pourrait s'appliquer à ma requête ( je demande parce que j'ai testé et ça marche pas ^_^' mais on sait jamais ), pour obtenir quelque chose du genre :

Code :
FROM gm_arret AS ar, gm_complet AS co
ou encore un INNER JOIN tout simple

Code :
INNER JOIN gm_complet AS co
?

Je pose ces questions car je suis pas sûr d'avoir saisi le principe de l'accès multiples aux tables, malgré avoir réussi à avoir un résultat jusqu'à présent.

Merci par avance.

Petit edit : lorsque que j'ai linké les requetes SQL choix 1 et 2, j'ai involontairement inversé les deux, ce qui permettra de mieux comprendre l'erreur de l'absence de déclaration de table manquante.
Cortux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 19h18   #7
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 707
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 707
Points : 3 277
Points : 3 277
Citation:
Je suis navré RunCodePhp mais j'ai énormement de mal à procéder comme tu le fait. Ma requête étant assez monstrueuse, je suis pas sur de pouvoir adapter ta méthode à la requête.
C'est dommage car c'est la manière la plus naturelle et logique de découper un chaine SQL.

Dans les code sObjets (POO) on retrouve très souvent le même principe, ce n'est pas hasard car le SQL (pour un SELECT du moins), la structure est la suivante :
SELECT (les champs)
FROM (les tables)
(INNER/LEFT OUTER/RIGHT OUTER) JOIN (les jointures)
WHERE (les clauses)
GROUP BY (les regroupements)
ORDER BY (les tri)
LIMIT (délimitation)

Et en POO ça donne des codes du genre :
Code :
1
2
3
4
5
6
7
 
$sql->select('les champs')
     ->from('les tables')
     ->join('les jointures')
     ->where('les clauses')
     ->groupby('les regroupement')
     ->order_by('les tri');
Ca ressemble étrangement à ce que j'ai mis et aussi à ce que tu dis.
Mais c'est pas du SQL à proprement parlé, c'est des classes Objets qui sont conçues comme ça pour justement éviter une chaine d'un seul bloc qui à juste titre n'est pas pratique dans un cas comme le tiens.
Découper la requête de manière logique devient par moment nécessaire.


Mais le vrai problème que je remarque, c'est dans ton 2ème cas tu prévois de faire une clause : co.complet IN(1,2,3,4)
Pour ma part il n'y a pas 36 solutions :
- Soit il faut rajouter cette table "gm_complet" pour ensuite rajouter cette clause/condition
- Soit il ne faut pas rajouter cette table et encore moins cette condition.

Mais c'est en expriment ton besoin qui va le déterminer, pas en bidouillant le SQL.
Quitte à l'écrire sur un bloc note quand on a un peu de mal, car il n'y a pas besoin de faire du code pour exprimer les résultats voulu.


En tout cas on ne pourra deviner la requête qui serait à faire si on ne connait pas les résultat qui seraient à obtenir.
Dans un cas comme ça, il peut être utile de fournir ce qu'on appel un jeu d'essai, c'est à dire une liste (simple) des lignes des tables :
- D'un coté les résultats qu'on souhaite dans le cas 1
- De l'autre, les résultats du cas 2, on montrant bien ce qui doit être récupérer ou à exclure par rapport au cas 1 pour bien voir la différence.


Truc pratique, c'est de faire les 2 requêtes (les 2 cas) dans PhpMyAdmin, en vérifiant bien que les résultat/lignes soient correctes.
Le but est d'obtenir 2 chaines de requêtes totalement fonctionnelles.
De la même manière que tu as mis précédemment, mais sans erreurs.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 08h34   #8
Invité de passage
 
Inscription : février 2011
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 11
Points : 0
Points : 0
Salut RunCodePhp

J'ai lu avec attention ton post. D'après tes dires, la construction que j'ai faite n'est pas la plus appropriée, du moins n'est plus. Elle avait une fonction au départ, maintenant elle doit en avoir deux et effectivement ma méthode ne fonctionne plus. Pourtant, malgré que le soucis me paraisse simple, cela reste éminement compliqué. Je dois accéder à une table, mais le seul moyen d'y accéder est la condition inverse à ce dotn j'ai besoin, c'est à s'arracher les cheveux

Néanmoins, je vais essayer d'appliquer ta méthode et suivre tes conseils voir si j'arrive à un résultat différent, plus performant.

Je repasse donner mes résultat rapidement.

Merci une fois de plus en tout cas
Cortux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 15h03   #9
Invité de passage
 
Inscription : février 2011
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 11
Points : 0
Points : 0
Re bonjour RunCodePhp

Je viens un peu donner des nouvelles! En fait, mon problème s'est étendu à plusieurs pages. La table gm_complet est en fait comme un petit satellite et est quasi inaccessible. Elle répondait à des besoin fixes et a été créée telle qu'elle. Dès que j'ai dû y avoir accès, je me suis retrouvé au même problème, impossible à déclarer, ni à jointer. Son utilité posant problème lors d'un appel en particulier, ben j'ai supprimé définitivement ces besoins, rejoingnant un peu ce que tu as dis : "Soit il ne faut pas rajouter cette table et encore moins cette condition."

En tout cas merci infiniment pour les explications, même si la solution n'a pas été trouvée, j'y vois déjà bien plus clair dans la conception de requête.

Je repasserai pour noter le message en résolu.

Merci à tous
Cortux est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h07.


 
 
 
 
Partenaires

Hébergement Web