8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai pouillé un moment le web et google concernant mon problème, mais rien de concrète jusqu'ici. Alors je me tourne vers vous dans l'espoir d'y voir le bout.

Je vous explique déjà ce que je souhaite réaliser:

J'ai deux tables. L'une concernant les titres des spécifications d'un produit (taille, poids, etc) et l'autre les spécifications même du produit (30cm, 2kg, etc).


--
-- Structure de la table `specs_titre`
--

CREATE TABLE IF NOT EXISTS `specs_titre` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `desc_fr` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=111 ;

--
-- Structure de la table `specs_donnee`
--

CREATE TABLE IF NOT EXISTS `specs_donnee` (
  `id_specs_donnee` int(11) NOT NULL AUTO_INCREMENT,
  `id_specs_titre` int(11) NOT NULL,
  `id_articles` int(11) NOT NULL,
  `text_fr` text NOT NULL,
  PRIMARY KEY (`id_specs_donnee`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=75 ;


j'ai donc la possibilité d'ajouter/supprimer des titres de spécifications en tout temps.

Ce que je souhaite avoir maintenant c'est un tableau avec comme 1ère colonne, TOUS les titres, et en 2ème colonne, l'attribut du produit choisi.


<table>
 <tr>
<td>Poids</td><td>2kg</td>
</tr>
<tr>
<td>taille</td><td>30cm</td>
</tr>
<tr>
<td>etc</td><td>etc</td>
</tr></table>


Ce que j'arrive aisément faire avec cette requête mysql:

SELECT * FROM specs_titre LEFT JOIN specs_donnees ON specs_titre.id = specs_donnees.id_specs_titre


Mon problème c'est que si j'ajoute le WHERE id_articles = 1 mon tableau se réduit aux seules enregistrement avec id_articles à 1 et ne m'affiche plus TOUS les titres de la colonne1.

En gros le résultat souhaité et celui-ci:

<table>
 <tr>
<td>Poids</td><td>2kg</td>
</tr>
<tr>
<td>taille</td><td>30cm</td>
</tr>
 <tr>
<td>hauteur</td><td>NULL</td>
</tr>
<tr>
<td>couleur</td><td>NULL</td>
</tr>
<tr>
<td>etc</td><td>etc</td>
</tr></table>


C'est à dire qu'il m'affiche tous les titres même s'il manque des donnée correspondantes.

J'espère m'avoir expliqué correctement. Merci à vous
Modifié par Sp4tz (10 Jan 2011 - 10:25)
RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH

Ce que ca peut être rageant la programmation Smiley biggrin

Merci beaucoup. J'ai effectivement remplacé

SELECT * FROM specs_titre LEFT JOIN specs_donnees ON specs_titre.id = specs_donnees.id_specs_titre WHERE article_id = '1'

par

SELECT * FROM specs_titre LEFT OUTER JOIN specs_donnees ON specs_titre.id = specs_donnees.id_specs_titre WHERE article_id = '1' AND article_id IS NULL

Et ça fonctionne!!! Mais j'ai passé tellement d'heures à trouver, à pouiller tous les sites et je me rends compte que je ne suis même pas à 0.001% des possibilités de PHP/MYSQL Smiley decu

C'est déprimant... en tout cas merci de ton aide, tu me remonte un peu le moral Smiley smile
Modifié par Sp4tz (16 Dec 2010 - 07:57)
Tu es le bienvenu, Smiley smile

et comme la syntaxe ne se devine pas je t'invite à lire de bon tutos comme celui que je t'ai indiqué plus haut : http://sqlpro.developpez.com/

Au passage j'ai beaucoup appris "par hasard" en tombant sur des articles qui ne répondaient pas directement à la question que je me posais. Smiley cligne
Hey merci pour ces info.... j'ai effectivement lu ton lien et j'ai un petit soucis avec la requête LEFT OUTER JOIN.

Si tu prends l'exemple n°13 du lien http://sqlpro.developpez.com/cours/sqlaz/jointures/ que tu m'as donnée et que j'ai suivis, il me pose ce problème:

SELECT * FROM specs
LEFT OUTER JOIN specs_tbl ON specs.id = specs_tbl.id_rel_specs 
WHERE  specs_tbl.id_articles = '45' OR specs_tbl. id_articles IS NULL ORDER BY attribut,ordre

Si je n'ai aucune inscription dans la table specs_tbl, la requête fonctionne et me retourne le tableau.

Si je créé un enregistrement avec l'id 45 et que je lance la requête, elle fonctionne aussi. Ex id = 45
SELECT * FROM specs
LEFT OUTER JOIN specs_tbl ON specs.id = specs_tbl.id_rel_specs 
WHERE  specs_tbl.id_articles = '45' OR specs_tbl. id_articles IS NULL ORDER BY attribut,ordre

Mais dés que je change l'id de 45 a 77 alors qu'il existe déjà des inscriptions pour l'id 45 mais pas pour 77, ça ne fonctionne plus. Je n'ai plus ma table specs de gauche.
SELECT * FROM specs
LEFT OUTER JOIN specs_tbl ON specs.id = specs_tbl.id_rel_specs 
WHERE  specs_tbl.id_articles = '77' OR specs_tbl. id_articles IS NULL ORDER BY attribut,ordre



C'est comme si la valeurs NULL n'existait plus et je ne peux plus récupérer toutes les données de la table specs.

Un idée d'où viens ce problème? Merci d'avance