Probleme de création de requete SQL ...

Eléphant du PHP | 183 Messages

22 déc. 2008, 19:48

Bonjour,

C'est la fin d'année est mes neuronnes sont fatigués ! je cale !

J'ai une table1 qui contient mes enregistrements

Les champs => Les valeur
Champs1 => 2
Champs2 => 4
Champs3=> 10

J'ai une autre table2 qui contient le texte
CREATE TABLE `table2` (
  `id` int(50) NOT NULL auto_increment,
  `mod` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=25 ;

INSERT INTO `modalite` (`id`, `mod`, `cat`) VALUES (2, 'valeur bla bla');
INSERT INTO `modalite` (`id`, `mod`, `cat`) VALUES (4, 'valeur bla bla bli bli');
INSERT INTO `modalite` (`id`, `mod`, `cat`) VALUES (10, 'valeur toto');

Donc en gros j'essai de faire afficher le texte "valeur" en fonction de mes enregistrement ...

je voudrais donc afficher :
valeur bla bla
valeur bla bla bli bli
valeur toto'


et pas les numéro 2, 4 et 10 que j'obtiens avec la requete
$result = mysql_query("SELECT * FROM table1 WHERE id = '$_GET[lire]' ORDER BY id DESC");
$c=mysql_fetch_array($result);


Merci de votre aide
Modifié en dernier par fabien_14 le 22 déc. 2008, 20:36, modifié 1 fois.
_________
Fabien

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 déc. 2008, 20:35

Peux-tu nous donner la structure de la table1.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 183 Messages

22 déc. 2008, 20:48

Bonjour,

Voici la structure.

Code : Tout sélectionner

CREATE TABLE `table1` ( `id` int(11) NOT NULL auto_increment, `cat` varchar(10) NOT NULL default '', `pays` varchar(200) NOT NULL default '', `age` varchar(200) NOT NULL default '', `type` varchar(250) NOT NULL default '', `qui` varchar(250) NOT NULL default '', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=7 ;
J'ai bien fait un truc comme ceci mais sa ne fonctionne pas

Code : Tout sélectionner

$test = mysql_query("SELECT * FROM table1, table2 WHERE table1.cat=table2.id "); $test = mysql_query("SELECT * FROM table1, table2 WHERE table1.qui=table2.id "); $test = mysql_query("SELECT * FROM table1, table2 WHERE table1.pays=table2.id "); $test = mysql_query("SELECT * FROM table1, table2 WHERE table1.age=table2.id "); $test = mysql_query("SELECT * FROM table1, table2 WHERE table1.type=table2.id "); $tes=mysql_fetch_array($test);
de plus il faudrait faire 5 requête pour les 5 champs ( cat,pays,age,type,qui)?
Modifié en dernier par fabien_14 le 23 déc. 2008, 01:19, modifié 1 fois.
_________
Fabien

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

23 déc. 2008, 01:19

C'est quoi le champ de relation entre la table1 et la table2 car tes exemples ne sont pas très clairs.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 183 Messages

23 déc. 2008, 01:32

Bonjour,

En faite la table 1 contient les d'enregistrement

cat
pays
age
type
qui

Qui on comme valeur par exemple

cat =1
pays =2
age=3
type=4
qui=5

La table 2 ce sont simplement les intitulé de ses enregistrements

Dpnc la relation c'est le champs qui est égal a l'ID de la table2 qui a pour champs mod qui est l'intitulé

Voici une requete qui fonctionne pour 1 ... mais c'est pas terrible si je dois faire 5 requetes

$test = mysql_query("SELECT * FROM table1, table2 WHERE table1.qui=table2.id ");

Affichage de l'intitulé :
$tes=mysql_fetch_array($test);
<? print $tes[mod]; ?>
_________
Fabien

Eléphant du PHP | 254 Messages

23 déc. 2008, 10:33

Salut,

si j'ai bien compris, dans ta table 1 tu n'as que des IDs, alors que tous les intitulés sont dans la table2 ?
Et tu veux afficher le contenu de table1 mais avec les labels et pas les IDs ?
Et tes labels sont dans le champ mod de table2 ?

Dans ce cas y a pas a tortiller faut faire une jointure par label que tu veux ramener, et utiliser les alias, puisque tu vas utiliser plusieurs fois la table2 dans ta requete. De plus je te met des jointures en LEFT JOIN pour afficher quand meme le résultat si un intitulé manque dans table2

Code : Tout sélectionner

SELECT tcat.mod as cat , tpays.mod as pays , tage.mod as age , ttype.mod as type , tqui.mod as qui FROM table1 LEFT JOIN table2 tcat WHERE table1.cat=table2.id LEFT JOIN table2 tpays WHERE table1.pays=table2.id LEFT JOIN table2 tage WHERE table1.age=table2.id LEFT JOIN table2 ttype WHERE table1.type=table2.id LEFT JOIN table2 tqui WHERE table1.qui=table2.id
Essaye ca dans MyAdmin pour voir si c'est ce que tu veux

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

23 déc. 2008, 12:08

Ok, c'est bien ce que je pensais, tu as besoin de faire des requêtes imbriquées pour déterminer les labels stockés dans le champ "mod" de la table2 pour les champs : "cat, pays, age, type et qui" de la table1.

Voici la requête générale qui est constituée de 5 sous-requêtes de calcul de champ (une sous-requête pour déterminer le label de chaque champ de la table1)

Code : Tout sélectionner

SELECT (SELECT t2.mod FROM table2 as t2 WHERE t1.cat = t2.id) as valeur_cat, (SELECT t2.mod FROM table2 as t2 WHERE t1.pays = t2.id) as valeur_pays, (SELECT t2.mod FROM table2 as t2 WHERE t1.age = t2.id) as valeur_age, (SELECT t2.mod FROM table2 as t2 WHERE t1.type = t2.id) as valeur_type, (SELECT t2.mod FROM table2 as t2 WHERE t1.qui = t2.id) as valeur_qui FROM table1 as t1
J'explique le fonctionnement d'une de ses 5 sous-requêtes semblables:
La sous-requête: SELECT t2.mod FROM table2 as t2 WHERE t1.cat = t2.id
extrait le champ "mod" de la table surnommée "t2" correspondant au champ "cat" qui se trouve dans la table surnommée "t1". t1 et t2 sont des alias des tables : table1 et table2.
Les alias (surnoms) de tables sont recommandés voir obligatoires quand on utilise des sous-requêtes car ils permettent de préfixer les champs et ainsi désigner leur source, ainsi on peut faire communiquer des sous-requêtes entre-elles. La sous-requête est nommée par un alias car elle se trouve dans une requête mère.

Toutes les sous-requête ce cet exemple, servent à calculer la valeur d'un champ qui se trouve dans un SELECT parent de la forme:

SELECT
(...) as valeur_cat,
(...) as valeur_pays,
(...) as valeur_age,
(...) as valeur_type,
(...) as valeur_qui
FROM table1 as t1
J'ai enlevé les sous-requêtes pour faire valoir la structure globale de la requête générale. Ainsi on comprend que cette requête mère va diriger le traitement en lisant les enregistrements de la table1 et pour chaque ligne de cette table, elle va calculer les valeurs des champs : valeur_cat, valeur_pays, ... à partir des sous-requêtes correspondantes.

Voilà.
Modifié en dernier par sadeq le 23 déc. 2008, 12:33, modifié 2 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 183 Messages

23 déc. 2008, 12:31

Bonjour,


J'ai tester mais ceci me met l'erreur :

Code : Tout sélectionner

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /homepages/21/xxxxxx/htdocs/test/zonee/ftest.php on line 685
Ligne 685 :

$tes=mysql_fetch_array($test);
<? print $tes[mod]; ?>
_________
Fabien

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

23 déc. 2008, 12:39

Ce message veut dire que ta requête n'a rien retourné ou contient des erreurs. Tu dois faire un echo de ta requête SQL pour voir son texte puis avec copie/coller tu peux l'exécuter directement sur phpMyAdmin pour voir les erreurs.

Pour mon exemple, voici la base de test sur laquelle je me suis basé. Tu peux faire la comparaison avec ce que tu as:

Code : Tout sélectionner

-- -- Structure de la table `table1` -- CREATE TABLE `table1` ( `id` int(11) NOT NULL auto_increment, `cat` varchar(10) NOT NULL default '', `pays` varchar(200) NOT NULL default '', `age` varchar(200) NOT NULL default '', `type` varchar(250) NOT NULL default '', `qui` varchar(250) NOT NULL default '', PRIMARY KEY (`id`) ) ; -- -- Contenu de la table `table1` -- INSERT INTO `table1` (`id`, `cat`, `pays`, `age`, `type`, `qui`) VALUES (1, '1', '2', '3', '4', '5'), (2, '5', '4', '1', '3', '2'), (3, '4', '2', '3', '5', '1'); -- -------------------------------------------------------- -- -- Structure de la table `table2` -- CREATE TABLE `table2` ( `id` int(50) NOT NULL auto_increment, `mod` varchar(255) NOT NULL default '', PRIMARY KEY (`id`) ); -- -- Contenu de la table `table2` -- INSERT INTO `table2` (`id`, `mod`) VALUES (1, 'valeur bla bla'), (2, 'valeur bla bla bli bli'), (3, 'valeur toto'), (4, 'lalalllala'), (5, 'yyayyayyayyaya');
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 183 Messages

23 déc. 2008, 12:47

Bonjour,

J'ai envoyé les table dans Myadmin.

et mi ta requête dans le php

sa me fait toujours la même erreur (voici le php que j'ai mis):

Code : Tout sélectionner

$test = mysql_query("SELECT (SELECT t2.mod FROM table2 as t2 WHERE t1.cat = t2.id) as valeur_cat, (SELECT t2.mod FROM table2 as t2 WHERE t1.pays = t2.id) as valeur_pays, (SELECT t2.mod FROM table2 as t2 WHERE t1.age = t2.id) as valeur_age, (SELECT t2.mod FROM table2 as t2 WHERE t1.type = t2.id) as valeur_type, (SELECT t2.mod FROM table2 as t2 WHERE t1.qui = t2.id) as valeur_qui FROM table1 as t1"); $tes=mysql_fetch_array($test); (<<< erreur a cette ligne)


Sinon j'ai oublié de préciser cetet requete fais parti d'un affichage avec une premiere requette :
$result = mysql_query("SELECT * FROM table1 WHERE id = '$_GET[lire]' ORDER BY id DESC");
$c=mysql_fetch_array($result);
Donc j'affiche mes données comme ceci :

`id` int(11) NOT NULL auto_increment,
`champs1` varchar(10) NOT NULL default '',
`champs2` varchar(10) NOT NULL default '',

`cat` varchar(10) NOT NULL default '',
`pays` varchar(200) NOT NULL default '',
`age` varchar(200) NOT NULL default '',
`type` varchar(250) NOT NULL default '',
`qui` varchar(250) NOT NULL default '',

Donc pour le champs1 et champs2 je n'est pas besoin d'aller chercher l'intitulé. cependant pour les autre (cat, pays,age, type, qui) j'ai qu'un numero et pas d'intitulé qui se trouve dans la table2.
_________
Fabien

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

23 déc. 2008, 14:49

Les requêtes imbriquées ne fonctionnent que sous MYSQL 4.1 et supérieur. Vérifie ta version.

Sinon, tu exécute d'abord la requête sous PHPMYADMIN. On n'a pas besoin de PHP maintenant. C'est comme ça qu'il faut développer tes requêtes : Tu testes d'abord les requêtes sous PHPMyAdmin et quand elles fonctionnent bien et retournent les bons résultats, à ce moment là on les recopie dans un programme PHP.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 183 Messages

23 déc. 2008, 15:03

Bonjour,

J'ai je fais jamais ceci :) j'ai copier coller la requete tel quel dans phpMyadmin (Je suis hébergé sur 1and1 la version est la MySQL4.0 donc voila pourquoi cela ne marche pas :/ )

j'ai un mesage d'erreur :

Code : Tout sélectionner

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT t2.mod FROM table2 as t2 WHERE t1.cat = t2.id) as valeur
EDIT :

Jai ouvert une base SQL 5.0

On peut donc recommencer les essais :)
_________
Fabien

Eléphant du PHP | 183 Messages

15 janv. 2009, 22:19

Bonjour,

J'ai refais mon site en SQL 5 sur 1and1.

Ma requete ne fonctionne pas

Voici le message d'erreur

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /homepages/21/d1xxxxx/htdocs/test/zonee/fc.php on line 689
_________
Fabien

ViPHP
ViPHP | 5924 Messages

16 janv. 2009, 03:47

Alors plusieurs remarques :
- Avant tout va voir ça parce que les messages d'erreurs, ils n'existent pas pour rien :)
- Ensuite, mod est un mot réservé de MySQL
- SQL 5 n'existe pas, on dit MySQL 5 (quand on travaille sous MySQL parce qu'il y a aussi d'autres SGBD que MySQL et qui utilisent aussi le langage SQL)