Page 1 sur 2

moteur toujours en panne

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

Posté : 08 oct. 2005, 17:19
par Ripat
Si tu fais une requête multi-tables sans jointure ---> produit cartésien !

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

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

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

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

Posté : 08 oct. 2005, 19:28
par Ripat
Si tu n'as pas de colonnes communes de table en table, il ne te reste plus qu'à faire une requête par table.

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

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

Posté : 10 oct. 2005, 09:32
par pingoo
Je comprend en partie mais je n'ais pas la moindre idée de comment mettre en pratique.

Posté : 10 oct. 2005, 10:16
par Cyrano
Ç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.

Posté : 10 oct. 2005, 11:33
par pingoo
OK merci je vais m'y mettre.

Posté : 12 oct. 2005, 11:33
par Invité
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

Posté : 12 oct. 2005, 11:44
par zeus
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

Posté : 12 oct. 2005, 13:59
par pingoo
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?