moteur toujours en panne

Eléphanteau du PHP | 40 Messages

08 oct. 2005, 16:56

Bonjour, voila je viens de restructurer ma base en regroupant toutes les catégories mais je fais la même requête et cela me donne plus de 3000 résultat pour 10 réel. Voici ma requête :

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, fk2.ville, fk2.nomDestination1, fk2.nomDestination2, fk2.nomDestination3, fk2.departement, fk2.prix, fk2.id_auto, DATE_FORMAT(fk2.date, '%d.%m.%y') date, SUBSTRING(fk2.description,1,200) AS description, fk3.marque, fk3.modele, fk3.pseudom, fk3.ville, fk3.nomDestination1, fk3.nomDestination2, fk3.nomDestination3, fk3.departement, fk3.prix, fk3.id, DATE_FORMAT(fk3.date, '%d.%m.%y') date, SUBSTRING(fk3.description,1,200) AS description, fk4.fonction, fk4.societe, fk4.pseudom, fk4.adresse_societe, fk4.nom_fichier, fk4.lieu, fk4.salaire, fk4.id, DATE_FORMAT(fk4.date, '%d.%m.%y') date, SUBSTRING(fk4.profil_rechercher,1,200) AS profil_rechercher FROM fk_produits as fk1, fk_auto as fk2, fk_moto as fk3, fk_offre_emploi as fk4 where fk1.cat LIKE '%". $mots_cle ."%' OR fk1.titre LIKE '%". $mots_cle ."%' OR fk1.ville LIKE '%". $mots_cle ."%' OR fk1.nomDestination1 LIKE '%". $mots_cle ."%' OR fk1.nomDestination2 LIKE '%". $mots_cle ."%' OR fk1.nomDestination3 LIKE '%". $mots_cle ."%' OR fk1.departement LIKE '%". $mots_cle ."%' OR fk1.prix LIKE '%". $mots_cle ."%' OR fk1.id LIKE '%". $mots_cle ."%' OR fk1.date LIKE '%". $mots_cle ."%' OR fk1.description LIKE '%". $mots_cle ."%' OR fk2.marques LIKE '%". $mots_cle ."%' OR fk2.modele LIKE '%". $mots_cle ."%' OR fk2.ville LIKE '%". $mots_cle ."%' OR fk2.nomDestination1 LIKE '%". $mots_cle ."%' OR fk2.nomDestination2 LIKE '%". $mots_cle ."%' OR fk2.nomDestination3 LIKE '%". $mots_cle ."%' OR fk2.departement LIKE '%". $mots_cle ."%' OR fk2.prix LIKE '%". $mots_cle ."%' OR fk2.id_auto LIKE '%". $mots_cle ."%' OR fk3.marque LIKE '%". $mots_cle ."%' OR fk3.modele LIKE '%". $mots_cle ."%' OR fk3.ville LIKE '%". $mots_cle ."%' OR fk3.nomDestination1 LIKE '%". $mots_cle ."%' OR fk3.nomDestination2 LIKE '%". $mots_cle ."%' OR fk3.nomDestination3 LIKE '%". $mots_cle ."%' OR fk3.departement LIKE '%". $mots_cle ."%' OR fk3.prix LIKE '%". $mots_cle ."%' OR fk3.id LIKE '%". $mots_cle ."%' OR fk3.date LIKE '%". $mots_cle ."%' OR fk4.fonction LIKE '%". $mots_cle ."%' OR fk4.societe LIKE '%". $mots_cle ."%' OR fk4.pseudom LIKE '%". $mots_cle ."%' OR fk4.adresse_societe LIKE '%". $mots_cle ."%' OR fk4.nom_fichier LIKE '%". $mots_cle ."%' OR fk4.lieu LIKE '%". $mots_cle ."%' OR fk4.salaire LIKE '%". $mots_cle ."%' OR fk4.id LIKE '%". $mots_cle ."%' OR fk4.date LIKE '%". $mots_cle ."%' OR fk4.profil_rechercher LIKE '%". $mots_cle ."%' ";
Merci pour votre aide

ViPHP
ViPHP | 1380 Messages

08 oct. 2005, 17:19

Si tu fais une requête multi-tables sans jointure ---> produit cartésien !
ripat

Eléphanteau du PHP | 40 Messages

08 oct. 2005, 18:14

Ok merci pour ce lien très instructif néamoins je n'ais pas trouvé pourquoi le résultat de ma requête m'affiche plus de 3000 résultats. :oops:

Mammouth du PHP | 19672 Messages

08 oct. 2005, 18:16

Dans ta clause WHERE, il y a pas mal de conditions TOUTES séparées par un "OR" : donc tu as toutes les chances d'avoir pas mal de résultats correspondant. Il n'y a aucune jointure entre les tables, donc ça va tout te sortir en vrac.

As-tu assimilé (au moins sommairement) le principe de la jointure ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1380 Messages

08 oct. 2005, 18:18

Parce-que tu ouvres plusieurs tables:
fk_produits as fk1, fk_auto as fk2, fk_moto as fk3, fk_offre_emploi as fk4

Mais sans dire à MySQL comment les joindre. Par un ID ? Un nom ? Si dans une table 1 tu as un ID que tu retrouves dans une table 2, tu peux faire une jointure. Et ainsi de suite pour les autres tables...
ripat

Eléphanteau du PHP | 40 Messages

08 oct. 2005, 18:29

Non je crois que le principe de la jointure m'echappe.
Ce que je veux ce n'est pas afficher une colonne d'une table avec la colonne d'une autre table, c'est simplement rechercher dans toutes ma base de donné les résultats correspondants à 1 mot clé.

ViPHP
ViPHP | 1380 Messages

08 oct. 2005, 19:28

Si tu n'as pas de colonnes communes de table en table, il ne te reste plus qu'à faire une requête par table.
ripat

Eléphanteau du PHP | 40 Messages

10 oct. 2005, 08:10

Je ne vois pas comment faire une jointure avec un ID. La structure de ma base ne dois pas etre correct. J'ais un ID pour chaque table mais je ne comprend pas comment créer le lien entre les tables.
Je ne suis pas très fort en mysql... :oops:

Mammouth du PHP | 19672 Messages

10 oct. 2005, 09:04

Ben là, c'est sur: je t'ai fait une suggestion d'optimisation et le nombre de table a maigri pas mal, mais comme je t'avais dit, j,ai fait ça à l'arrache en 10mn: une base de données, ça se pense, ça se modélise et ça se valide si possible.

Je comprends bien ce que tu veux faire, mais effectivement, il faudrait passer une grosse journée pour créer un vrai dictionnaire de données, ensuite pour modéliser un modèle conceptuel de données avant même de commencer à construire la base. Alors est-ce que cette dernière phrase te parle un peu ou c'est du chinois pour toi ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 40 Messages

10 oct. 2005, 09:32

Je comprend en partie mais je n'ais pas la moindre idée de comment mettre en pratique.

Mammouth du PHP | 19672 Messages

10 oct. 2005, 10:16

Ça va être difficile de te résumer un cours complet sur la modélisation de base de données. Une visite sur developpez.com te donnera plein d'infos et des tutos sur le sujet.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 40 Messages

10 oct. 2005, 11:33

OK merci je vais m'y mettre.

Invité
Invité n'ayant pas de compte PHPfrance

12 oct. 2005, 11:33

J'ais en partie assimilé le notion de jointure mais le problème et que mes données ce mélange lors de l'affichage?
Voici mon code :

Code : Tout sélectionner

SELECT fk1.cat, fk1.id, fk1.rub, fk1.titre, fk1.pseudom, fk1.ville, fk1.nomDestination1, fk1.departement, fk1.prix, fk1.id, DATE_FORMAT(fk1.date, '%d.%m.%y') date, SUBSTRING(fk1.description,1,200) AS description, fk2.id_auto, fk2.marques, fk2.departement, fk2.prix, fk2.date, fk3.id_prod, fk3.id_auto1 FROM fk_produits as fk1, fk_auto as fk2, inter as fk3 where fk1.id = fk3.id_prod AND fk2.id_auto = fk3.id_auto1
En plus du mélange cela ne m'affiche que 7 résultat puisque une condition (fk1.id = fk3.id_prod ) n'est vrai que 7 fois.
Voici la structure de ma table intérmédiaire :

Code : Tout sélectionner

CREATE TABLE `inter` ( `id_prod` int(10) NOT NULL default '0', `id_auto1` int(10) NOT NULL default '0' ) TYPE=MyISAM;
Ca fait deux jour que j'y travail et ca commence à devenir vraiment :evil: .
Merci pour votre aide

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 oct. 2005, 11:44

Tu paut faire des jointures avec JOIN

Code : Tout sélectionner

SELECT fk1.cat, fk1.id, fk1.rub, fk1.titre, fk1.pseudom, fk1.ville, fk1.nomDestination1, fk1.departement, fk1.prix, fk1.id, DATE_FORMAT(fk1.date, '%d.%m.%y') date, SUBSTRING(fk1.description,1,200) AS description, fk2.id_auto, fk2.marques, fk2.departement, fk2.prix, fk2.date, fk3.id_prod, fk3.id_auto1 FROM (fk_produits as fk1 JOIN fk_auto as fk2 ON fk1.id = fk3.id_prod) JOIN inter as fk3 ON fk2.id_auto = fk3.id_auto1
Mais si tu utilises des tables avec des gros volumes de données (miliers d'enregistrements) pensent bien à créer des indexs sur fk1.id, fk3.id_prod, fk2.id_auto et fk3.id_auto1 sinon ta requete va prendre des heures
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 40 Messages

12 oct. 2005, 13:59

Le résultat est exactement identique je pense que mon erreur doit etre au niveau de la base de donnée.
Base intermédiaire :

Code : Tout sélectionner

CREATE TABLE `inter` ( `id_prod` int(10) NOT NULL default '0', `id_auto1` int(10) NOT NULL default '0' ) TYPE=MyISAM; # # Contenu de la table `inter` # INSERT INTO `inter` VALUES (6, 1); INSERT INTO `inter` VALUES (7, 7); INSERT INTO `inter` VALUES (8, 3); INSERT INTO `inter` VALUES (9, 4); INSERT INTO `inter` VALUES (10, 5); INSERT INTO `inter` VALUES (12, 6); INSERT INTO `inter` VALUES (13, 2);
Je ne sais pas si la jointure est bien établie?