Version complète: sur le forum Webmaster Hub : mysql - colum avec une valeur dans une liste
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
adn
Bonsoir smile.gif

Alors je cherche le meilleur moyen pour faire la requête suivante:

J'ai une liste de mot-clés séparés par des virgules et je voudrais retrouver toutes les lignes de ma table pour lesquelles il y a au moins une intersection avec la valeur d'une de mes colonnes.

Un exemple, ce sera plus simple wink.gif

liste de mot-clés recherchés : (1, 2, 3, 4)

Dans ma table mySQL j'ai:

CODE
         col1    col2
line1   toto    2, 3
line2   tutu    1, 5, 6
line3   tata    7


Y a-t-il moyen de récupérer line1 et line2 en une seule requête ?

CODE
SELECT col1, col2
FROM mytable
WHERE xxxx
Portekoi
Bonsoir,

Tu peux utiliser le 'In' :

SELECT col1, col2
FROM mytable
WHERE Col2 in ("1, 2, 3","1, 2")

Si tu n'avais qu'un chiffre et non un suite en col2, tu pourrais le faire ainsi :

SELECT col1, col2
FROM mytable
WHERE col2 in (1, 2, 3, 4)


Portekoi
adn
CITATION(portekoi @ mercredi 19 octobre 2005, 22h56)
Bonsoir,

Tu peux utiliser le 'In' :

SELECT col1, col2
FROM mytable
WHERE Col2 in ("1, 2, 3","1, 2")


Merci pour ta réponse, je connaissais pas IN et c'est une bonne piste. Cependant je ne comprends pas ton premier exemple qui a mon sens ne rend pas line1 et line2.

Je comprends qu'a gauche du IN du doit avoir une seule valeur, du coup il faudrait faire une boucle sur la liste des mot-clés recherchés:

CODE
Pour tous les mots-clés
Faire
   SELECT col1, col2
   FROM mytable
   WHERE mot-clés[i] IN col2
fait


Pas très performant....
Portekoi
Non justement.

Tu construis ta chaine en amont de ta requete.

Tu fais ta boucle for et en sortie tu obtiens par exemple "1, 5, 6, 9, 16"

Cette chaine peut etre issue d'un split ou autre....

Ensuite tu fais ta requete une seule fois avec le " in ($ma_variable_construite) "
adn
Re,

Je pense que je commence à comprendre.

Ta suggestion est de creer la liste des combinaisons possible, c'est çà ? Et ensuite de faire la requête.
Portekoi
exactement smile.gif
adn
OK pigé, merci.
Bon je vais m'arranger pour que l'ordre soit toujours le même sinon la combinatoire augmente considérablement !
Portekoi
Tu peux aussi le faire en 3 tables :

La table mot clé
La table des numéros (1, 2, 3, 4)
La table mot clé <-> numéros

Je vois pas trop ton schéma de base donc je ne me rends pas bien compte smile.gif

A toi de voir


Portekoi
Dan
Salut Adn,

Le type de requête que tu fais démontre bien que tu gagnerais à utiliser une table croisée.

En reprenant ton exemple, il suffirait d'une table avec un id et un mot clé.
Par exemple:
CODE
id     mot clé
1        1
1        2
2        4
2        5
2        12

dit que l'item numéro 1 a les mots clés 1 et 2 et que l'item numéro 2 a les mots clés 4, 5 et 12.

Comme ça tu ne sera plus ennuyé avec le nombre de mots clés maxi pour un item, de 0 à ... (sans limite)

Cela te permet aussi de faire des recherches sur "tous les mots clés de l'item X", ou "tous les items qui ont le mot clé Y".

En mettant des index sur ces deux champs, ce sera extrèmement rapide.

Dan
adn
Oui Dan smile.gif

C'est justement ce que je viens de finir de faire avant de venir faire une pause sur le hub wink.gif

Merci à tous les deux pour votre aide.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.