Plusieurs tables pour une recherche ?

Petit nouveau ! | 4 Messages

01 juil. 2011, 23:58

Salut tout le monde ! :)

J'ai besoin d'aide pour modifier un script que j'ai fais.
Il s'agit d'une requête qui doit me ressortir le résultat d'une recherche qui s'étend sur trois tables différents qui ont un champs commun avec une quatrième table nommée "membres". Il s'agit du champs ID.

En fait la table membres contient la liste des inscrits, et l'une des trois autres tables contient l'id de ce même membre, les autres tables sont en faite les types de comptes possibles sur le site.

Chaque table contient des champs qui lui est propre. Dans mon script javascript, on tape un nom ou un début de mot, et la requête s'effectue en temps réel vers la page php qui traite le mot tapé.

Tout fonctionnait jusqu'à ce que je décide de changer l'architecture de ma base de données, car avant cela, il n'y avait qu'une seule et même table pour tous les utilisateurs.

Mon objectif est donc de rechercher dans les trois tables des trois types de comptes si le mot y est présent dans les champs sélectionnés.

Donc :
- membres : ID,TYPE,EMAIL,etc...

- membres-chercheurs : ID_MEMBRE,NOM,PRENOM
- membres-recruteurs : ID_MEMBRE,NOM,PRENOM,RAISONSOCIALE
- membres-interims : ID_MEMBRE,RAISONSOCIALE

J'ai donc fait cette requête :
<?php
$suggest_total = db_query("SELECT
	
	c.id_membre,
	r.id_membre,
	i.id_membre,
	
	c.nom,
	r.nom,
	
	c.prenom,
	r.prenom,
	
	r.raisonsociale,
	i.raisonsociale
	
	FROM `membres-chercheurs` c,
	`membres-recruteurs` r,
	`membres-interims` i
	
	WHERE
	
c.nom like('%" . $search . "%')
 OR r.nom like('%" . $search . "%')
 
 OR c.prenom like('%" . $search . "%')
 OR r.prenom like('%" . $search . "%')
 
 OR r.raisonsociale like('%" . $search . "%')
 OR i.raisonsociale like('%" . $search . "%')
 
							   ");
?>
Et elle ne fonctionne pas. Elle ne me sort pas de message d'erreur, mais j'ai 0 résultats alors que quand je change la requête pour ne chercher que dans une seule table, ça fonctionne.

J'aimerais rajouter également que pour chaque résultat trouvé, j'aimerais qu'il cherche dans la table "membres-photos" la ligne correspondante à l'id du membre trouvé et qu'il me ressort son champs "image".

Avez-vous une idée de comment faire ça ? Pourriez-vous m'aider s'il vous plaît ? Je sais que c'est confus alors je vous donnerais un maximum de détails pour vous aider si ça ne vous dérange pas ... Je vous remercie de votre aide d'avance ! :wink:
Modifié en dernier par Nardoum le 02 juil. 2011, 00:54, modifié 2 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 juil. 2011, 00:48

salut,

tu a besoin d'une [url=http://sqlpro.developpez.com/cours/sqla ... s/jointure[/url]

pour info ta base est mal faite ça devrait être
membre
- id
- nom
- prenom
- raison social

chercheur
id
id membre

recruteur
id
id membre

interim
id
id membre

ceci dit il serait peux être mieux pensé d'avoir une table "type" (id, nomtype) et l'id type dans la table membre
qui deviendrait
membre
- id
- nom
- prenom
- raison social
- id type

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

02 juil. 2011, 00:52

En fait non car par exemple, si on rajoute un membre qui est de type 4 dans la table principale que tu me donnes, on aura un champs "nom" et "prenom" vide car ce membre est une entreprise et il n'a que raison sociale. A savoir que pour chaque table de type de compte, il y a beaucoup de champs différents.

Cela me permet de faire des "if $type == 0" alors on récupère les infos de la table de type premier, etc etc ... car ils ont des options différentes.

Delà dit, j'ai toujours eu du mal avec les jointure, j'ai réussit à en faire une pour la messagerie mais je sais pas comment les utiliser pour trois tables comme celles-là en même temps. Elles ne sont pas liées, on peut pas avec un même membre dans l'une et dans les autres, un membre n'a qu'une seule table qui lui est attribuée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 juil. 2011, 01:00

c'est pour cela que des champs peuvent être null, sinon c'est le souk t'a trop de table et c'est la merde, car la tu n'a pas de liaison entre les tables.

la base c'est pas d'info redondante, donc il faut voir
- comment ce définit un membre
- qu'est ce qu'un type de compte

a partir de la tu peux créer ta structure, mais au final c'est la même chose te faudra une (ou plusieurs jointure ;) )

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

02 juil. 2011, 01:03

J'aimerais bien changer et faire comme tu dis mais tout le site est basé dessus et je peux pas changer ça dans l'immédiat ^^' ... Mais je le ferais, promis !

En attendant il faut juste que ce script sois opérationnel.

Si je fais des jointures, je devrais mettre quoi pour le "ON" ? Parce que mes tables n'ont pas de liaisons entres elles, mais chaque table a une liaison avec la table principale.

Mais vous n'avez pas idée de pourquoi ma requête ne fonctionne pas ?

Je vais essayer cette nuit de faire comme tu m'as dis.

EDIT : J'ai fais comme tu as dis ...

Et j'ai fais ça :
<?php

	id,
	m.nom,
	m.prenom,
	m.raisonsociale,
	m.type,
	
	p.image
	
	FROM `membres` m
	
	INNER JOIN `membres-chercheurs` c
	ON c.id_membre = m.id
	
	INNER JOIN `membres-recruteurs` r
	ON r.id_membre = m.id
	
	INNER JOIN `membres-interims` i
	ON i.id_membre = m.id
	
	INNER JOIN `membres-photos` p
	ON p.id_membre = m.id
	
	WHERE
	
	m.nom like('%" . $search . "%')
 
 OR m.prenom like('%" . $search . "%')
 
 OR m.raisonsociale like('%" . $search . "%')

?>
Avant de joindre d'autres tables que "membres-chercheurs", ça m'affichait un résultat . Quand je rajoute les trois autres, ça me ressort 0 résultats ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 juil. 2011, 10:47

le m.id doit être a gauche et non a droite ;)
m.id = c.id_membre

heu tu a mis m.nom,
m.prenom,
m.raisonsociale,
m.type,
dans la table membre ?

si ce n'est pas le cas, il faut que tu le fasse sur les 3 autres tables ;) (donc 3 conditions sur le nom, 3 sur le prénom etc etc)

essai avec une table puis ajoute les autres ;)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

02 juil. 2011, 17:13

Oui je viens de rajouter le nom , prénom et raison sociale dans la table membres. ^^

J'ai finalement fabriqué une méthode pour pas me prendre la tête, j'ai utiliser la jointure seulement sur la table des photos et avec un if, je compare si le type du compte est 0, 1 ou 2 pour savoir si je dois afficher le nom et le prénom ou la raison sociale.