moteur de recherche sur plusieurs tables

Petit nouveau ! | 8 Messages

01 août 2005, 11:25

Bonjour à tous !

Je souhaite faire un moteur de recherche sur mon site.
Pour cela, il faut que je fasse une recherche dans plusieurs tables (identiques au niveau structure). Je souhaiterais trier les résultats par ordre alphabétique et faire un affichage page par page (donc utiliser un LIMIT).

S'il s'agissait de faire une recherche sur une table, je saurais comment faire, mais là, il faut rechercher sur plusieurs tables en même temps et je ne vois pas du tout comment faire.

Si quelqu'un peut éclairer ma lanterne ?

Merci d'avance.
SB

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 août 2005, 11:29

tout dépend de la structure

je suis déjà étonné que tu ais plusieurs tables de même structure ? quelle est la raison de ça ? :shock:

mais bon, pour sélectionner des données de plusieurs tables, il suffit de lister les tables dans le FROM, et debien préciser de quelle table proviennent les champs sélectionnés

ensuite tu peux tuiliser des jointures s'il y a des correspondances

Petit nouveau ! | 8 Messages

01 août 2005, 11:59

En faite, je suis en train de faire comme une boutique en ligne et une table correspond à chaque catégorie de produit.

Je viens d'essayer ca :

Code : Tout sélectionner

$sql = "SELECT tb1.nom, tb2.nom FROM tb1,tb2 WHERE tb1.valid = '1' AND tb2.valid = '1' LIMIT 1,10; $req = mysql_query($sql); while($donne = mysql_fetch_array($req)) { echo"$donne[nom]"; }
Ca affiche 2 fois chaque résultat de la tb2 !

A moins que ca ne soit pas comme ca qu'il fasse faire ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 août 2005, 12:00

j'aimerai voir la structure de ta base de données, c'est dur sinon de comprendre les requêtes et de t'aider

mais je soupçonne quelques problèmes de conceptions... :lol:

mais ce que tu fais c'est un produit cartésien, c'est normal que tu ais deux fois chaque résultat

ViPHP
pjl
ViPHP | 2119 Messages

01 août 2005, 12:02

mais je soupçonne quelques problèmes de conceptions... :lol:
+1
et ce post n'a rien à faire dans PHP. Il concerne les bases de données.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

01 août 2005, 12:11

mais je soupçonne quelques problèmes de conceptions... :lol:
+1
et ce post n'a rien à faire dans PHP. Il concerne les bases de données.
Modération : bon ok, en route alors

Petit nouveau ! | 8 Messages

01 août 2005, 12:19

Désolé d'avoir poster dans la mauvaise catégorie.

Voilà mes tables :

Code : Tout sélectionner

CREATE TABLE `tb1` ( `id` int(11) NOT NULL auto_increment, `ref` longtext, `nom` longtext, `image` longtext, `descr` longtext, `motcle` longtext, `valid` longtext, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE `tb2` ( `id` int(11) NOT NULL auto_increment, `ref` longtext, `nom` longtext, `image` longtext, `descr` longtext, `motcle` longtext, `valid` longtext, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
PS : Dans ma requêtes, je n'ai pas encore mis le LIKE pour le moteur de recherche. Je voudrais déjà que ca fonctionne avec la condition valid=1

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 août 2005, 12:23

comme prévu deux remarques :)

- une petite : pas très explicites les noms de tables... pour toi et encore plus pour nous ;)
- une grosse : tu as 2 tables exactement identiques
si ce sont des articles, qui peuvent appartenir à 2 catégories (l'une ou l'autre, mais pas les deux à la fois) voici ce que tu devrais avoir :

Code : Tout sélectionner

CREATE TABLE `tb1` ( `id` int(11) NOT NULL auto_increment, `ref` longtext, `nom` longtext, `image` longtext, `descr` longtext, `motcle` longtext, `valid` longtext, `id_categorie` tinyint ----> clé étrangère vers la table Categories Categories ----------- id_categorie libelle_categorie
ça simlifierait tes requêtes... et puis si tu rajoutes des catégories, tu rajoutes une table à chaque fois ? non non non [-X

Petit nouveau ! | 8 Messages

01 août 2005, 12:35

pas très explicites les noms de tables
En faite, mes tables ont le nom de mes catégories. Ici, c'est deux tables que j'ai créer pour faire un essai. je trouvais ca plus simple d'avoir, quand il y a besoin de les taper, des noms court pour essayer

Code : Tout sélectionner

et puis si tu rajoutes des catégories, tu rajoutes une table à chaque fois ?
Oui. C'était pour éviter d'avoir trop d'enregistrement par table. Par exemple, 6000 enregistrements, c'est raisonable pour une seule table ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 août 2005, 12:48

Oui. C'était pour éviter d'avoir trop d'enregistrement par table. Par exemple, 6000 enregistrements, c'est raisonable pour une seule table ?
oui ça l'est.
Déjà ne compte pas en nombre d'enregistrements, mais en taille de stockage sur le disque. C'est là que tu pourrais éventuellement avoir des problèmes, mais tu as de la marge.

Une base de données c'est du stockage, rien de plus. Tu n'as pas à te préoccuper de limiter le nombre d'enregistrements, puisque tu as le langage SQL qui te permet de faire des sélections suivant des critères par exemple.

Ici tu limites le nombre d'enregistrements, mais tu va chercher sur deux tables à la fois, cela doit être bien plus coûteux en temps d'exécution.

Peu importe que tu ais 60, 6 000 ou 600 000 enregistrements dans ta table.

Par contre, il y a des méthodes pour créer une bonne structure de base de données. Cherche "Merise" par exemple.

Si tu crées une nouvelle table à chaque catégorie tu stockes à chaque fois une nouvelle fois les informations de description de la table !
Et puis si tu changes un article de catégorie, quel bazard...

Bref, prend un peu de temps pour revoir ton organisation.
En gros, on peut dire qu'une table correspond à un type d'objet "physique" de ce que tu souhaites faire, et tu peux te dire que si tu as des tables en double, et des champs qui se répétent plus de 2 fois dans une même table, c'est qu'il y a des problèmes ;)

Petit nouveau ! | 8 Messages

01 août 2005, 12:57

Merci pour les conseils.
Je vais revoir mon organisation. Je vais tout remettre dans une seule table. Surtout que je comptais faire une recherche sur environ 8 tables.
Je pensais que 6000 enregistrement était trop pour une table et que de séparer en plusieurs tables serait plus rapide.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 août 2005, 13:01

Je vais revoir mon organisation.
excellente idée :pouce:
Je pensais que 6000 enregistrement était trop pour une table et que de séparer en plusieurs tables serait plus rapide.
surement pas ;)

Petit nouveau ! | 8 Messages

03 août 2005, 20:06

Je viens de revoir mon organisation. C'est maintenant beaucoup plus simple. merci pour les conseils.