Moteur de recherche interne en panne

Eléphanteau du PHP | 40 Messages

08 oct. 2005, 00:23

Bonjour, voila j'ais un moteur de recherche avec une grande requête mysql. Le problème et que le résultat n'est pas correct.
Lorsqu'il n'y a qu'un résultat cela m'en affiche 4158..
Voici m'a requête :

Code : Tout sélectionner

$select = "SELECT fk_ameublement_electromenager.cat, fk_ameublement_electromenager.titre, fk_ameublement_electromenager.pseudom, fk_ameublement_electromenager.ville, fk_ameublement_electromenager.nomDestination1, fk_ameublement_electromenager.nomDestination2, fk_ameublement_electromenager.nomDestination3, fk_ameublement_electromenager.departement, fk_ameublement_electromenager.prix, fk_ameublement_electromenager.id, DATE_FORMAT(fk_ameublement_electromenager.date, '%d.%m.%y') date, SUBSTRING(fk_ameublement_electromenager.description,1,200) AS description, fk_auto.marques, fk_auto.modele, fk_auto.pseudom, fk_auto.ville, fk_auto.nomDestination1, fk_auto.nomDestination2, fk_auto.nomDestination3, fk_auto.departement, fk_auto.prix, fk_auto.id_auto, DATE_FORMAT(fk_auto.date, '%d.%m.%y') date, SUBSTRING(fk_auto.description,1,200) AS description, fk_bateau.cat, fk_bateau.titre, fk_bateau.pseudom, fk_bateau.ville, fk_bateau.nomDestination1, fk_bateau.nomDestination2, fk_bateau.nomDestination3, fk_bateau.departement, fk_bateau.prix, fk_bateau.id, DATE_FORMAT(fk_bateau.date, '%d.%m.%y') date, SUBSTRING(fk_bateau.description,1,200) AS description, fk_divers.cat, fk_divers.titre, fk_divers.pseudom, fk_divers.ville, fk_divers.nomDestination1, fk_divers.nomDestination2, fk_divers.nomDestination3, fk_divers.departement, fk_divers.prix, fk_divers.id, DATE_FORMAT(fk_divers.date, '%d.%m.%y') date, SUBSTRING(fk_divers.description,1,200) AS description, fk_dvd_vhs_cinema.cat, fk_dvd_vhs_cinema.titre, fk_dvd_vhs_cinema.pseudom, fk_dvd_vhs_cinema.ville, fk_dvd_vhs_cinema.nomDestination1, fk_dvd_vhs_cinema.nomDestination2, fk_dvd_vhs_cinema.nomDestination3, fk_dvd_vhs_cinema.departement, fk_dvd_vhs_cinema.prix, fk_dvd_vhs_cinema.id, DATE_FORMAT(fk_dvd_vhs_cinema.date, '%d.%m.%y') date, SUBSTRING(fk_dvd_vhs_cinema.description,1,200) AS description, fk_immobilier.cat, fk_immobilier.titre, fk_immobilier.pseudom, fk_immobilier.ville, fk_immobilier.nomDestination1, fk_immobilier.nomDestination2, fk_immobilier.nomDestination3, fk_immobilier.departement, fk_immobilier.prix, fk_immobilier.id, DATE_FORMAT(fk_immobilier.date, '%d.%m.%y') date, SUBSTRING(fk_immobilier.description,1,200) AS description, fk_informatique_bureautique.cat, fk_informatique_bureautique.titre, fk_informatique_bureautique.pseudom, fk_informatique_bureautique.ville, fk_informatique_bureautique.nomDestination1, fk_informatique_bureautique.nomDestination2, fk_informatique_bureautique.nomDestination3, fk_informatique_bureautique.departement, fk_informatique_bureautique.prix, fk_informatique_bureautique.id, DATE_FORMAT(fk_informatique_bureautique.date, '%d.%m.%y') date, SUBSTRING(fk_informatique_bureautique.description,1,200) AS description, fk_instruments_musique.cat, fk_instruments_musique.titre, fk_instruments_musique.pseudom, fk_instruments_musique.ville, fk_instruments_musique.nomDestination1, fk_instruments_musique.nomDestination2, fk_instruments_musique.nomDestination3, fk_instruments_musique.departement, fk_instruments_musique.prix, fk_instruments_musique.id, DATE_FORMAT(fk_instruments_musique.date, '%d.%m.%y') date, SUBSTRING(fk_instruments_musique.description,1,200) AS description, fk_jeux_jouet_figurines.cat, fk_jeux_jouet_figurines.titre, fk_jeux_jouet_figurines.pseudom, fk_jeux_jouet_figurines.ville, fk_jeux_jouet_figurines.nomDestination1, fk_jeux_jouet_figurines.nomDestination2, fk_jeux_jouet_figurines.nomDestination3, fk_jeux_jouet_figurines.departement, fk_jeux_jouet_figurines.prix, DATE_FORMAT(fk_jeux_jouet_figurines.date, '%d.%m.%y') date, SUBSTRING(fk_jeux_jouet_figurines.description,1,200) AS description, fk_jeux_video_consoles.cat, fk_jeux_video_consoles.titre, fk_jeux_video_consoles.pseudom, fk_jeux_video_consoles.ville, fk_jeux_video_consoles.nomDestination1, fk_jeux_video_consoles.nomDestination2, fk_jeux_video_consoles.nomDestination3, fk_jeux_video_consoles.departement, fk_jeux_video_consoles.prix, fk_jeux_video_consoles.id, DATE_FORMAT(fk_jeux_video_consoles.date, '%d.%m.%y') date, SUBSTRING(fk_jeux_video_consoles.description,1,200) AS description, fk_livres_bd_revues.cat, fk_livres_bd_revues.titre, fk_livres_bd_revues.pseudom, fk_livres_bd_revues.ville, fk_livres_bd_revues.nomDestination1, fk_livres_bd_revues.nomDestination2, fk_livres_bd_revues.nomDestination3, fk_livres_bd_revues.departement, fk_livres_bd_revues.prix, fk_livres_bd_revues.id, DATE_FORMAT(fk_livres_bd_revues.date, '%d.%m.%y') date, SUBSTRING(fk_livres_bd_revues.description,1,200) AS description, fk_moto.marque, fk_moto.modele, fk_moto.pseudom, fk_moto.ville, fk_moto.nomDestination1, fk_moto.nomDestination2, fk_moto.nomDestination3, fk_moto.departement, fk_moto.prix, fk_moto.id, DATE_FORMAT(fk_moto.date, '%d.%m.%y') date, SUBSTRING(fk_moto.description,1,200) AS description, fk_offre_emploi.fonction, fk_offre_emploi.societe, fk_offre_emploi.pseudom, fk_offre_emploi.adresse_societe, fk_offre_emploi.nom_fichier, fk_offre_emploi.lieu, fk_offre_emploi.salaire, fk_offre_emploi.id, DATE_FORMAT(fk_offre_emploi.date, '%d.%m.%y') date, SUBSTRING(fk_offre_emploi.profil_rechercher,1,200) AS profil_rechercher, fk_outils_materiaux.cat, fk_outils_materiaux.titre, fk_outils_materiaux.pseudom, fk_outils_materiaux.ville, fk_outils_materiaux.nomDestination1, fk_outils_materiaux.nomDestination2, fk_outils_materiaux.nomDestination3, fk_outils_materiaux.departement, fk_outils_materiaux.prix, fk_outils_materiaux.id, DATE_FORMAT(fk_outils_materiaux.date, '%d.%m.%y') date, SUBSTRING(fk_outils_materiaux.description,1,200) AS description, fk_photo_video.cat, fk_photo_video.titre, fk_photo_video.pseudom, fk_photo_video.ville, fk_photo_video.nomDestination1, fk_photo_video.nomDestination2, fk_photo_video.nomDestination3, fk_photo_video.departement, fk_photo_video.prix, fk_photo_video.id, DATE_FORMAT(fk_photo_video.date, '%d.%m.%y') date, SUBSTRING(fk_photo_video.description,1,200) AS description, fk_sports_loisirs_vacances.cat, fk_sports_loisirs_vacances.titre, fk_sports_loisirs_vacances.pseudom, fk_sports_loisirs_vacances.ville, fk_sports_loisirs_vacances.nomDestination1, fk_sports_loisirs_vacances.nomDestination2, fk_sports_loisirs_vacances.nomDestination3, fk_sports_loisirs_vacances.departement, fk_sports_loisirs_vacances.prix, fk_sports_loisirs_vacances.id, DATE_FORMAT(fk_sports_loisirs_vacances.date, '%d.%m.%y') date, SUBSTRING(fk_sports_loisirs_vacances.description,1,200) AS description, fk_telephonie.cat, fk_telephonie.titre, fk_telephonie.pseudom, fk_telephonie.ville, fk_telephonie.nomDestination1, fk_telephonie.nomDestination2, fk_telephonie.nomDestination3, fk_telephonie.departement, fk_telephonie.prix, fk_telephonie.id, DATE_FORMAT(fk_telephonie.date, '%d.%m.%y') date, SUBSTRING(fk_telephonie.description,1,200) AS description, fk_tv_son_home_cinema.cat, fk_tv_son_home_cinema.titre, fk_tv_son_home_cinema.pseudom, fk_tv_son_home_cinema.ville, fk_tv_son_home_cinema.nomDestination1, fk_tv_son_home_cinema.nomDestination2, fk_tv_son_home_cinema.nomDestination3, fk_tv_son_home_cinema.departement, fk_tv_son_home_cinema.prix, fk_tv_son_home_cinema.id, DATE_FORMAT(fk_tv_son_home_cinema.date, '%d.%m.%y') date, SUBSTRING(fk_tv_son_home_cinema.description,1,200) AS description, fk_vetements_accessoires.cat, fk_vetements_accessoires.titre, fk_vetements_accessoires.pseudom, fk_vetements_accessoires.ville, fk_vetements_accessoires.nomDestination1, fk_vetements_accessoires.nomDestination2, fk_vetements_accessoires.nomDestination3, fk_vetements_accessoires.departement, fk_vetements_accessoires.prix, fk_vetements_accessoires.id, DATE_FORMAT(fk_vetements_accessoires.date, '%d.%m.%y') date, SUBSTRING(fk_vetements_accessoires.description,1,200) AS description FROM fk_ameublement_electromenager, fk_auto, fk_bateau, fk_divers, fk_dvd_vhs_cinema, fk_immobilier, fk_informatique_bureautique, fk_instruments_musique, fk_jeux_jouet_figurines, fk_jeux_video_consoles, fk_livres_bd_revues, fk_moto, fk_offre_emploi, fk_outils_materiaux, fk_photo_video, fk_sports_loisirs_vacances, fk_telephonie, fk_tv_son_home_cinema, fk_vetements_accessoires where fk_vetements_accessoires.cat LIKE '%". $mots_cle ."%' ";
Si on pouvait faire plus court..
Merci pour votre aide

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

08 oct. 2005, 00:58

Salut je sait pas si on peut faire plus court mais plus long pour que ce soit juste peut etre :wink:

Tu met une clause WHERE que sur un champ d'un table:

Code : Tout sélectionner

where fk_vetements_accessoires.cat LIKE '%". $mots_cle ."%'
je pense que tu as listé toute la BD d'ou les 4158
tu pourrai ajouter les autres champs:

Code : Tout sélectionner

WHERE fk_vetements_accessoires.cat LIKE '%". $mots_cle ."%' AND fk_ameublement_electromenager.cat LIKE '%". $mots_cle ."%' AND fk_auto.cat LIKE '%". $mots_cle ."%' ....
Sinon pour alléger tu peut utilser des alias pour le tables, dans la clause FROM, par exemple:

Code : Tout sélectionner

FROM fk_ameublement_electromenager as fk1, fk_auto as fk2 ....
et donc tu aura quelque chose comme ça:

Code : Tout sélectionner

$select = "SELECT fk1.cat, fk1.titre, fk1.pseudom, fk1.ville, fk1.nomDestination1, fk1.nomDestination2, fk1.nomDestination3, fk1.departement, fk1.prix, fk1.id, DATE_FORMAT(fk1.date, '%d.%m.%y') date, SUBSTRING(fk1.description,1,200) AS description, fk2.marques, fk2.modele, fk2.pseudom, .... ...

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

08 oct. 2005, 08:26

Cette requête est incohérente: tu fais une recherches sur 19 tables, mais ta clause WHERE ne teste qu'un seul champ de la dernière table: quelles sont les clauses de tri sur les 18 autres tables ? :shock: :?:

Mais ce n'est pas le plus grave : ta requête montre une structure de base de données ahurissante: tu as 19 tables qui ont toutes le même schéma là où deux tables auraient suffi : En effet, toutes tes tables ont les mêmes champs, seul le nom de la table en rapport avec l'information qu'elle contient change.
Tu aurais donc pu avoir une table infos avec ces mêmes champs + un champ en clé étrangère, et une seconde table type_info qui listerait ces noms de tables avec deux champs: une clé primaire (qu'on retrouverait donc en clé étrangère dans l'autre) et le titre du type d'info.

De cette manière, ta requête serait limitée à deux tables et autrement plus efficace.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

08 oct. 2005, 09:15

Petite rectification : j'ai dit qu'avec deux table ça irait, en fait il en faudrait 4 à cause de quelques différences. Voici un schémà très rapidement évalué pour optimiser tout ça :

Code : Tout sélectionner

+--------------------------------------+ | vehicules | +--------------------+-----------+-----+ | veh_id |INT | PK | | veh_categorie |VARCHAR(16)| | | veh_marque |VARCHAR(32)| | | veh_modele |VARCHAR(32)| | +--------------------+-----------+-----+ +---------------------------------------+ | produits | +--------------------+------------+-----+ | pro_id |INT | PK | | pro_type_id |INT | FK | | pro_cat |VARCHAR(32) | | | pro_titre |VARCHAR(32) | | | pro_pseudom |VARCHAR(32) | | | pro_ville |VARCHAR(64) | | | pro_nomDestination1|VARCHAR(128)| | | pro_nomDestination2|VARCHAR(128)| | | pro_nomDestination3|VARCHAR(128)| | | pro_departement |VARCHAR(32) | | | pro_prix |DECIMAL(8,2)| | | pro_date |DATE | | | pro_description |TEXT | | +--------------------+------------+-----+ +--------------------------------------+ | type_produits | +--------------------+-----------+-----+ | type_pro_id |INT | PK | | type_pro_titre |VARCHAR(32)| | +--------------------+-----------+-----+ +----------------------------------------+ | emplois | +---------------------+------------+-----+ | emp_id |INT | PK | | emp_societe |VARCHAR(32) | | | emp_fonction |VARCHAR(32) | | | emp_pseudom |VARCHAR(32) | | | emp_adresse_societe |VARCHAR(32) | | | emp_ville |VARCHAR(128)| | | emp_nom_fichier |VARCHAR(32) | | | emp_lieu |VARCHAR(64) | | | emp_salaire |DECIMAL(9,2)| | | emp_date |DATE | | | emp_profil_recherche|TEXT | | +---------------------+------------+-----+
C'est bien sur très sommaire, mais avec ça, tu pourrais accélérer notablement tes recherches sans faire des requête de 20km ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 40 Messages

08 oct. 2005, 10:00

OK merci pour votre aide.
C'est sur que la structure de mes tables n'est pas super mais classées par rubrique c'est plus propre, maintenant question pratique c'est pas le top.
Et si je garde ma structure et ajoute les nouvelles tables avec une structure optimisé pour la recherche général du site?

Mammouth du PHP | 19672 Messages

08 oct. 2005, 10:04

Tu penses à quoi au juste ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 40 Messages

08 oct. 2005, 10:14

Garder mes tables et en ajouter 4 avec l'incertion dans les deux groupes afin de creer des tables optimisées pour la recherche sur tout le site?

Mammouth du PHP | 19672 Messages

08 oct. 2005, 10:22

En clair, toutes les données seraient en double ? Pour quoi faire ? Tu pourrais faire ça en solution transitoire pour transférer le contenu des tables abbérantes dans une nouvelles structure optimisée, mais pour que ça vaille la peine, il faudrait qu'ensuite tu vires les premières. Par contre ça implique que tu devras revoir toutes tes requêtes SQL :?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 40 Messages

08 oct. 2005, 12:07

Je vais revoir la structure de toutes mes tables et les modifier.
C'est sur toutes mes requêtes devront elles aussi êtres modifiées.
Merci pour ton aide. :D