8792 sujets

Développement web côté serveur, CMS

Salut les gens,

Voilou, j'ai un soucis de requête MySQL.
J'ai une table "news", avec un champ "titre".
J'aimerais pouvoir retourner toutes les news où dans le titre il y a par exemple le mot "ciel".
J'ai essayé cette requête :
SELECT * FROM news WHERE titre LIKE '%ciel%'


Ca marche, problême il me retourne tous les titres ou il y a la chaine de caractères "ciel", commme "officiellement".
Moi j'aimerais qu'il ne me retourne que les titres avec le mot "ciel".
J'ai essayé ça, mais ça ne marche point :

SELECT * FROM news WHERE titre LIKE '%ciel%' AND titre IN (SELECT titre FROM news WHERE titre NOT LIKE '%_ciel_%')

(la deuxième requête retournant tous les titre où il n' a pas de chaine caractère contenant ciel)

Alors si il y a du spécialiste du SQL !!! Sinon on le fera en PHP !

Merci d'avance pour vos concseils.
Modifié par Bouh (12 Mar 2007 - 16:01)
Salut !

Et comme ça ?

SELECT * FROM news WHERE titre LIKE 'ciel'

Modifié par skatybabe (08 Mar 2007 - 15:55)
Salut skatybabe,

J'ai déjà essayé et ça ne marche pas. Cette requête ne retournerait que les news dont le titre est simplement "ciel", et pas un caractère de plus!!! Smiley sweatdrop
Perso un truc me parait evident...

"ciel" sera forcement précédé d'un espace ...

Donc :

SELECT * FROM news WHERE titre LIKE '% ciel%'


Tout simplement...
Salut kendyan

Et non ce n'est pas si évident que ça !
Avec la requête que tu m'a donné, il te retournera tout les titres avec le mot "ciel", mais aussi tous les titres avec la chaine de caractere "ciel" en debut de de mot. Par exemple je dis un bétise, mais il te retournera "cielement" !
hum j'ai ete jeter un coup d'oeil sur ca, et a cette lecture moi je recupererais toutes les lignes et le ferais en PHP
Modifié par RoseGrenouille (09 Mar 2007 - 17:39)
Salut,
tu as essayé avec une expression régulière ? tu colles ciel dans une variable, genre
$ciel="ciel";

on ne va pas non plus se compliquer la vie Smiley smile et tu fais un truc genre
where titre REGEXP '"(^|\s)'.$ciel.'(\s|$)"';

en gros, si je ne me suis pas planté (je ne suis pas spécialiste des expressions régulières...) ça donne ciel commençant ou précédé d'un espace blanc et finissant ou suivi d'un espace blanc
Have swing
au fait, ton histoire me trotte dans la tête et, en y réfléchissant (oui, oui, malgré l'âge et l'alcool, j'y arrive encore Smiley cligne ), je pense que, toujours en collant ton ciel dans une variable, mais comme ça
$ciel =" ciel ";

et en faisant ta recherche simplement avec
where titre like '%$ciel%'

ça pourrait marcher, dans la variable les espaces ont un sens, pas dans une requête. Le plus simple étant toujours le plus élégant (et le moins lourd côté serveur), ça vaut la peine de tenter.
Essaye et tiens-nous au courant...
Have swing
Salut tout le monde,

virtualgadjo j'ai testé avec regexp, et il me retourne trop de résultats. N'étant pas non plus un spécialiste des expressions régilières je n'ai pas su l'adapter!
Pour ta deuxième solution, ça ne va pas marché non plus, si "ciel" se retrouve en début ou fin de titre, il n'y aura pas d'espace soit devant soit derrère, du coup il ne retournera pas le résultat.

Sinon je crois que je vais faire comme dis RoseGrenouille, récupérer dans un premier temps tous les titres avec la chaine de caractère "ciel", puis traiter en php que celle qui n'ont que le mot "ciel".

Ou si vous avez d'autres idées !!!
Merci en tous cas.
Salut,
bah c'est tout bête, si tu le coup des expressions régulières est trop complexe fais-toi trois variables
$ciel=" ciel ";
$ciel2="ciel ";
$ciel3=" ciel";

et fais une recherche avec
where title like '%$ciel%' or like '$ciel2%' or like '%$ciel3'

comme ça tu couvres les trois possibilités, ciel au début suivi d'un espace, à la fin précédé d'un espace et précédé et suivi d'un espace. Mais je crains seulement que ça te retourne le même genre de résultat que la regexp, tu as peut-être tout simplement beaucoup de titres contenant le mot ciel Smiley smile
Have swing
Oui je l'ai fait 5 min avant que tu postes ton message, c'est tout con et ça marche ! Tout simplement comme ça d'ailleurs :
SELECT * FROM news
WHERE titre LIKE '% ciel %'
   OR titre LIKE '% ciel'
   OR titre LIKE 'ciel %'


Problème c'est lourd, surtout si on décide de rechercher deux mots dans un titre !!!

Du coup je me suis penché sur REGEXP. Je suis en plein apprentissage des expressions regulieres, je galère un peu mais je commence à comprendre, notamment la proposition que tu as faites plus haut!

J'ai reussi à retourner toutes les news avec le titre contenant le mot ciel, mais pas quand il ets en début ou en fin de chaine !

SELECT * FROM news WHERE titre REGEXP '[A-Za-z0-9]+[^A-Za-z0-9]rhesus[^A-Za-z0-9][A-Za-z0-9]+'


Je sens que je suis pas loin, mais je rame Smiley sweatdrop !!! Si y'a des gens balaise en expressions regulieres dans le coin; ils sont la bienvenue !!! Smiley cligne
Hallelujah, j'ai trouvé !!!
A force de fouiller sur le web pour essayer de comprendre, je suis tombé sur l'exemple qu'il fallait, à cette adresse tout en bas.

En fait il faut utilisé les classes [[:<:]] et [[:>:]]. Me demander pas trop se que ça signifie exactement Smiley langue !

Bref ça donne cela :
SELECT * FROM news WHERE titre REGEXP '[[:<:]]ciel[[:>:]]'


Et ça marche à merveille !!! Merci à tous pour votre aide! Et si ça peut servir à quelqu'un d'autre, tant mieux !!! Smiley cligne

++
Modifié par Bouh (12 Mar 2007 - 15:59)