aide pour une jointure

Eléphanteau du PHP | 25 Messages

13 févr. 2012, 17:23

Bonjours à tous j'ai un petit soucis de jointure
Voici mon soucis.

Je souhaite récupérer les nom des valeurs qui ce trouve dans plusieurs table.

j'ai une table pricipale, que voici
CREATE TABLE IF NOT EXISTS `list` (
  `Id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `item` smallint(5) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  KEY `key_mobId` (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
voici les secondaire
CREATE TABLE IF NOT EXISTS `category1` (
  `item_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(120) NOT NULL DEFAULT '',
   PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `category2` (
  `item_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(120) NOT NULL DEFAULT '',
   PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `category3` (
  `item_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(120) NOT NULL DEFAULT '',
   PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Bref, ce n'est pas cela le soucis des tables.

Je bloque sur ma la manière me permettant de récupérer le champ `name` de (category1, category2 et category3) sachant que
le champ `item_id ` des tables secondaires (category1, category2 et category3) est egal à `item` de la principale (list)

quand je trouve une id dans la table principale je dois pouvoir récupérer son `name` dans (category1 ou category2 ou category3)

Voici ma requête:
$result = $db->query('
SELECT d.Id, d.item, i.item_id, i.name, a.item_id, a.name
FROM list AS d 
Left JOIN category1 AS i ON i.item_id = d.item 
Left JOIN category2 AS a ON a.item_id = d.item
WHERE Id=\''.pun_linebreaks(pun_trim($_GET['id'])).'\' ORDER BY item ASC ', true) or error('Unable to fetch list #categoty1, #category2', __FILE__, __LINE__, $db->error
Pourriez vous me dire svp comment faire, j'avoue que ça doit pas être bien compliquer, mais là je bloque,

Merci de votre aide (désoler si je me suis mal exprimer)

Cordialement

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

13 févr. 2012, 20:51

Bref, ce n'est pas cela le soucis des tables.
Ben si ca l'est, et beaucoup meme, car si c'etait bien concu tu n'aurais aucun probleme a faire ta requete qui est quand meme tres basique.

Est-ce que tu as la possibilie de changer ? Vraiment ce serait bien...

Si "un item peut appartenir a zero ou n categories" et "une categorie peut contenir 0 ou n items", voici la modelisation correcte (SQL a verifier car je l'ai ecrit a la main):

CREATE TABLE IF NOT EXISTS `list` (
  `Id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `item` smallint(5) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  KEY `key_mobId` (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `category_contains_items` (
  `fk_item_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `fk_category_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`fk_item_id`, `fk_category_id`),
  FOREIGN KEY (fk_item_id)
                        REFERENCES list(Id),
  FOREIGN KEY (fk_category_id)
                        REFERENCES category(category_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

[sql]CREATE TABLE IF NOT EXISTS `category` (
  `category_id` int(11) NOT NULL DEFAULT '0',
  `category_name` varchar(120) NOT NULL DEFAULT '',
   PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En gros tu as une jointure qui contient l'ID de l'item et celui de la categorie, et qui contient autant de ligne que de categorie auquel appartient un item. Du coup les requetes sont tres simples, si tu veux connaitre les categories auxquelles appartient un item, les items que contient une categorie, le nombre etc.

De plus avec ton system tu ne peux pas facilement rajouter de categorie (oblige de creer une nouvelle table, modfier toutes tes requetes etc) alors que la c'est facile, juste une nouvelle ligne dans "categorie", tu peux faire ca via une interface web.