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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
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
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.
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
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
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
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
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
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" <antoun@free.fr> a écrit dans le message de news:
407A698C.5050006@free.fr...
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
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
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 ...
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 ...
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 ...