Forums Développement Multimédia

Aller au contenu

Pb de syntaxe sur un select

CODE PHP MySQL

4 réponses à ce sujet

#1 jean.ceugniet

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 391 messages

Posté 11 December 2007 - 22:13 PM

Salut,

J'ai une table item (id_item, titre, commentaire), et une table item_motcle (id_item_motcle, id_item, id_motcle). La table item_motcle contient la liste des id pour lesquels l'item id_item est associé au mot-clé id_motcle. Je souhaite récupérer la liste des items (avec leurs infos dans la table item) qui sont associé à TOUS les id_motcle passés en paramètres. Mais la requète que je fais me donne apparemment les résultats d'un OU, non d'un ET. Je dois avoir une erreur de logique dans ma requète mais je ne trouve pas laquelle.
Exemple : Je souhaite récupérer tous les items ayant les mots-clés 2, 3, 5 et 8 (tous ces mots-clés devant être associés à chacun des items).
SELECT id_item, titre, commentaire
FROM item
WHERE id_item IN (SELECT id_item FROM item_motcle WHERE id_motcle IN (2,3,5,8))
ORDER BY titre

Merci

#2 Matthieu!

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 4003 messages

Posté 12 December 2007 - 09:02 AM

Et pourquoi pas :

SQL
SELECT id_item, titre, commentaire
FROM item a
LEFT JOIN item_motcle b ON a.id_item = b.id_item
WHERE b.id_motcle IN (2,3,5,8)
ORDER BY a.titre


?

Attention il est dangeureux de faire des liaisons entre clé primaire qui sont normalement auto_increment, il vaut mieux avoir un identifiant (ou une table) de jointure supplémentaire.
Ca permet aussi plus tard qu'un item soit lié à plusieurs mots clés smile.gif

#3 jean.ceugniet

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 391 messages

Posté 12 December 2007 - 14:18 PM

Alors :
  • id_item est ici la clé primaire de la table item
  • id_item est indexée dans la table item_motcle, mais ce n'est pas la clé primaire : celle-ci est un auto increment nommé id_item_motcle
  • on peut donc bien avoir plusieurs mots-clés pour un item, et plusieurs items pour un mot-clé

Le problème reste le même avec la requète proposée : on ramasse les items ayant en mot-clé le 2 ou le 3 ou le 5 ou le 8, ou plusieurs de ceux-ci; mais je souhaite ne récupérer que les items qui ont TOUS ces mots-clés.

#4 Matthieu!

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 4003 messages

Posté 12 December 2007 - 15:28 PM

Citation (MarvinLeRouge @ Dec 12 2007, 02:18 PM) Voir le message
Alors :
  • id_item est ici la clé primaire de la table item
  • id_item est indexée dans la table item_motcle, mais ce n'est pas la clé primaire : celle-ci est un auto increment nommé id_item_motcle
  • on peut donc bien avoir plusieurs mots-clés pour un item, et plusieurs items pour un mot-clé
Le problème reste le même avec la requète proposée : on ramasse les items ayant en mot-clé le 2 ou le 3 ou le 5 ou le 8, ou plusieurs de ceux-ci; mais je souhaite ne récupérer que les items qui ont TOUS ces mots-clés.


ok pour les identifiants smile.gif

Je ne sais pas s'il existe une directive IN en mode AND

SQL
SELECT a.id_item, a.titre, a.commentaire
FROM item a
JOIN item_motcle b ON a.id_item = b.id_item
WHERE b.id_motcle = 2 AND b.id_motcle = 3 AND b.id_motcle = 5 AND b.id_motcle = 8
ORDER BY a.titre


Non ?

#5 jean.ceugniet

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 391 messages

Posté 15 December 2007 - 12:54 PM

Non, cette syntaxe renvoie forcément un ensemble vide : ça signifierait que id_motcle = 2 ET id_motcle = 3 SUR LA MEME LIGNE. J'ai bien trouvé une syntaxe, mais peu satisfaisante (plein de join), donc pour l'instant je garde la syntaxte suivante :
SELECT * FROM item WHERE
(id_item IN (SELECT id_item FROM item_motcle WHERE id_motcle = 2))
AND
(id_item IN (SELECT id_item FROM item_motcle WHERE id_motcle = 3))
AND
(id_item IN (SELECT id_item FROM item_motcle WHERE id_motcle = 5))




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP