Aller au contenu

mysql - colum avec une valeur dans une liste


Sujets conseillés

Posté (modifié)

Bonsoir :)

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 ;)

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

Dans ma table mySQL j'ai:

          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 ?

SELECT col1, col2
FROM mytable
WHERE xxxx

Modifié par adn
Posté

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

Posté (modifié)
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:

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

Pas très performant....

Modifié par adn
Posté

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) "

Posté

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.

Posté

OK pigé, merci.

Bon je vais m'arranger pour que l'ordre soit toujours le même sinon la combinatoire augmente considérablement !

Posté

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 :)

A toi de voir

Portekoi

Posté

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:

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

Posté

Oui Dan :)

C'est justement ce que je viens de finir de faire avant de venir faire une pause sur le hub ;)

Merci à tous les deux pour votre aide.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...