Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Enlever les articles des enregistrements

5 réponses
Avatar
PresenceNet
Bonjour a tout le monde,

Les visiteurs d'un site peuvent laisser a la posterite (pour l'envoi d'un
satellite qui doit revenir sur Terre dans 50 000 ans) leur morceau de
musique prefere aujourd'hui ainsi que l'auteur ou le compositeur du-dit
morceau.
Ils introduisent leur morceau prefere ainsi que l'auteur via un formulaire
dont voici une portion du code :

><form method="post" action="inserer.php">
>Chanteur ou groupe <input type="text" name="chanteur">

Je dois faire un affichage montrant, par ordre DECROISSANT, les auteurs et
morceaux choisis identiques le PLUS de fois
qu'ils auront ete choisis (une sorte de Top 10).

Mon probleme est le suivant : si une personne introduit 'The Beatles' et une
autre introduit 'Beatles' (sans l'article) pour la
MEME chanson, cela sera affiche deux fois. J'aimerais que cela ne soit
affiche qu'UNE seule fois ...

Voici la requete : $sql = "SELECT chanteur, titre, count(*) as total_entree
FROM ma_table GROUP BY chanteur, titre ORDER BY total_entree DESC LIMIT
$debut,$nb";

en sachant que 'total_entree' sert a comptabiliser le nombre
d'enregistrements identiques et la variable $nb sert a compter le nombre de
pages.

Auriez-vous une idee comment je pourrais faire comprendre a PHP/MySql que
'beatles' et 'the beatles' ne font qu'un ;-)
PS : j'ai un module de recherche sur le site et, dans ce module, j'utilise
la requete suivant :

> $requete = "SELECT `numero`, `chanteur` , `titre` FROM `ma_table` WHERE
`chanteur` LIKE '%".$chanteur."%'";

et si je fais une recherche sur 'beatles', il m'affiche alors tous les
enregistrement comprenant 'beatles' et evidemment 'the beatles' aussi.

Merci deja de m'avoir lu et de votre aide precieuse.

Dominique,

5 réponses

Avatar
John Gallet
Auriez-vous une idee comment je pourrais faire comprendre a PHP/MySql que
'beatles' et 'the beatles' ne font qu'un ;-)



Je ne vois à froid qu'une solution, non satisfaisante : filtrer les articles
et de manière générale tous les mots de liaison gênants avant l'insertion en
base. Le problème est que tu ne peux que définir une liste de mots
interdits, qui, par définition, ne sera jamais exhaustive.

Cf http://fr2.php.net/manual/en/ref.strings.php pour les fonctions de
gestion de chaînes de caractères et
http://fr2.php.net/manual/en/ref.array.php de tableaux te permettant de
faire ce filtrage.

a++
JG

Avatar
Antoun
Ceci dit, le raisonnement en "chanteur like %chanteur%" peut te réserver
des surprises... par ex., "abba" et "abbalone" (j'invente) seraient
considérés comme identiques. (je ne raisonne que sur le chanteur, mais
tu peux faire la même chose sur les autres colonnes).

Pour éviter cela, je suggère deux solutions très proches, qui consistent
à référencer les articles possibles et à les éliminer

- soit tu te fais une table des articles (avec l'espace au besoin, pour
éviter là aussi des surprises : "The ", "La ", "L'", etc.). A chaque
saisie, tu vérifies la présence d'un article au début
SELECT A.article, LENGTH(A.article) AS N
FROM articles A
WHERE '$chanteur' LIKE CONCAT(A.article, '%')
ORDER BY LENGTH(A.article) DESC -- prio à l'article le + long

Si cette requête te ramène qqch, tu tronques les N premiers caractères.
(attention, les apostrophes dans $chanteur doivent être doublées pour
éviter des erreurs de syntaxe SQL.)

- même chose, mais plutôt qu'une table tu te fais une RegEX. A la
saisie, tu transformes le nom de ton chanteur
define("REGEX_ARTICLES","^(The |La |L')") ;
(...)
$chanteur = eregi_replace(REGEX_ARTICLES, "", $chanteur) ;

Dans tous les cas, la meilleure solution est encore de proposer à la
saisie une liste déroulante des chanteurs déjà référencés, et de ne
garder la zone libre que pour des chanteurs pas encore saisis.

Bon travail !

Antoun
Avatar
Antoine Dinimant
qqch comme ça ?

SELECT T.chanteur, T.titre, count(*) as total_entree
FROM ma_table T1, ma_table T2
WHERE T1.chanteur like CONCAT('%', T2.chanteur, '%')
OR T2.chanteur like CONCAT('%', T1.chanteur, '%')
GROUP BY T1.chanteur
Avatar
Bernard Koninckx
Ca peut marcher mais il faut que l'ID de chaque record soit différent sinon
le record sera comptabilisé 2 fois ...

Bernard

"Antoine Dinimant" a écrit dans le message de news:

qqch comme ça ?

SELECT T.chanteur, T.titre, count(*) as total_entree
FROM ma_table T1, ma_table T2
WHERE T1.chanteur like CONCAT('%', T2.chanteur, '%')
OR T2.chanteur like CONCAT('%', T1.chanteur, '%')
GROUP BY T1.chanteur


Avatar
Antoun
bah non... imagine le cas (assez général), d'un chanteur cité une seule
fois. Si je fais T1.idchanteur <> T2.idchanteur, le record ne sera même
pas comptabilisé une seule fois ! Ou alors je n'ai pas compris ton
objection...

Bernard Koninckx a écrit:
Ca peut marcher mais il faut que l'ID de chaque record soit différent sinon
le record sera comptabilisé 2 fois ...