Page 1 sur 1

Moteur de recherche interne en panne

Posté : 08 oct. 2005, 00:23
par pingoo
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

Posté : 08 oct. 2005, 00:58
par Truc
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, .... ...

Posté : 08 oct. 2005, 08:26
par Cyrano
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.

Posté : 08 oct. 2005, 09:15
par Cyrano
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 ;)

Posté : 08 oct. 2005, 10:00
par pingoo
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?

Posté : 08 oct. 2005, 10:04
par Cyrano
Tu penses à quoi au juste ?

Posté : 08 oct. 2005, 10:14
par pingoo
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?

Posté : 08 oct. 2005, 10:22
par Cyrano
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 :?

Posté : 08 oct. 2005, 12:07
par pingoo
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