Aller au contenu

[MySQL] Aide pour une requête, SVP !


Wault

Messages recommandés

Salut à tous,

Mes cours de MySQL remonte à une dizaine d'années maintenant, et autant je me débrouille pour les requête de newbie, autant dès que ça commence à devenir à peine sérieux, je nage.

Je pourrais résoudre le problème que je vais vous énoncer ci-après en utilisant des boucles foreach en PHP (par exemple), mais je préfèrerais franchement avoir une solution en MySQL pure ou presque.

Là, par exemple, j'ai une table "video" avec un champ "tags" qui contient une liste de tags séparés par des virgules.

(Si - d'ailleurs - vous avez mieux pour les stocker, je suis preneur).

J'ai une liste de tags et je cherche toutes les vidéos contenant au moins un des tags.

Exemple :

Vidéo 1 : tags = "Asimov, robots, science-fiction, Fondation"

Vidéo 2 : tags = "Bradbury, science-fiction, Mars, chronique"

Video 3 : tags = "Voltaire, Candide, chronique"

J'ai la liste de tags suivante : "fondation, chronique, science-fiction" => renvoie Vidéo 1 et Vidéo 2.

Et la liste de tags suivante : "chronique, internet, mysql" => renvoie Vidéo 2 et Vidéo 3.

En bref, existe-t-il un moyen d'avoir la liste des vidéos concernées par une requête MySQL "élégante" ou pas ?

Merci d'avance.

Lien à poster

la solution facile (mais qui renverra des réponses avec le tag science-fiction pour une requete sur science, par exemple):

select * from video where

tags like '%fondation%'

or tags like '%chronique%'

or tags like '%science-fiction%';

la solution plus compliquée:

select * from video where

(tags like 'fondation'

or tags like 'fondation, %'

or tags like '%, fondation'

or tags like '%, fondation, %')

or

(tags like 'chronique'

or tags like 'chronique, %'

or tags like '%, chronique'

or tags like '%, chronique, %')

or

(tags like 'science-fiction'

or tags like 'science-fiction, %'

or tags like '%, science-fiction'

or tags like '%, science-fiction, %');

Edit, concernant la phrase "(Si - d'ailleurs - vous avez mieux pour les stocker, je suis preneur).":

le plus propre c'est que tu fais 3 tables:

video: identifiant', 'titre', 'etc'

tag: 'identifiant', 'nom'

video_tag: 'identifiant_video', 'identifiant_tag'

du coup tu fais ça:

select distinct video.* from video

join video_tag on video_tag.identifiant_video=video.identifiant

join tag on tag.identifiant=video_tag.identifiant_tag

where tag.nom in ('fondation', 'chronique', 'science-fiction');

Lien à poster

Merci pour ta réponse détaillée.

Je n'avais pas du tout pensé à faire une table spécifique aux tags, et à ajouter une relation entre les tags et les vidéos.

Cela pourrait effectivement grandement me faciliter la tâche par la suite.

C'est pourtant assez évident quand on y réfléchit.

Dès le départ, j'ai senti que stocker une liste de tags dans une chaîne n'était pas bon. Sauf que je ne suis pas parvenu à mettre le doigt sur ce qui n'allait pas, alors que maintenant c'est limpide : liste => table avec chacun des éléments + relation ! 'didju ! :D

Je m'y mets tout de suite. :D

Lien à poster
×
×
  • Créer...