Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/07/2011, 23h44   #1
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Par défaut Requête MySQL de recherche et clés étrangères

Bonjour,

J'ai réalisé un tableau "dynamique" qui affiche pour chaque case un bonhomme composé de 3 éléments distincts lié entre eux dans la BDD. http://takeaphoto.eu/wof/index.php

Mon soucis se situe lors de la création d'un moteur de recherche.

En effet, ma requête MySQL "originaire" possède déjà un WHERE afin de faire correspondre les clés étrangères de chacun des éléments
Code :
SELECT a.id,a.first_name,a.last_name,a.id_body,a.id_flag,b.id,b.image_body,c.id,c.country,c.image_flag FROM wof_name AS a, wof_body AS b, wof_flag AS c WHERE a.id_body=b.id AND a.id_flag=c.id ORDER BY a.last_name ASC
Et quand je veut faire une requête MySQL avec WHERE LIKE '% %', cela pose problème pour l'affichage du résultat (car je ne sais pas comment écrire mon WHERE)
Code :
SELECT a.id,a.first_name,a.last_name,a.id_body,a.id_flag,b.id,b.image_body,c.id,c.country,c.image_flag FROM wof_name AS a, wof_body AS b, wof_flag AS c WHERE a.id_body=b.id AND a.id_flag=c.id AND a.first_name,a.last_name,c.country LIKE '%$requete%' ORDER BY a.last_name ASC"
Donc ma question est : Comment écrire une requête (et surtout le WHERE) pour effectuer une recherche quant on a des clés étrangers de plusieurs tables ?

Voici mon code en entier (qui marche si l'on fait une recherche avec un seul champ) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx");
$requete = htmlspecialchars($_GET['cle']);
IF(isset($_GET['cle']))
$requet="SELECT a.id,a.first_name,a.last_name,a.id_body,a.id_flag,b.id,b.image_body,c.id,c.country,c.image_flag FROM wof_name AS a, wof_body AS b, wof_flag AS c WHERE a.id_body=b.id AND a.id_flag=c.id AND a.first_name,a.last_name,c.country LIKE '%$requete%' ORDER BY a.last_name ASC";
else
$requet="SELECT a.id,a.first_name,a.last_name,a.id_body,a.id_flag,b.id,b.image_body,c.id,c.country,c.image_flag FROM wof_name AS a, wof_body AS b, wof_flag AS c WHERE a.id_body=b.id AND a.id_flag=c.id ORDER BY a.last_name ASC";
 
?>
<form id="monform" name="form1" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>" style="padding-left: 20px; padding-bottom: 30px;">
    	<label>
        	<input type="text" name="cle"/>
        </label>
    	<label>
        	<input type ="submit" name="bouton" value="Search" />
        </label>
</form>                    
<center><TABLE cellspacing="0px" cellpadding="0px"><tr>
<?php
$retour = mysql_query($requet);
$i=1;
 
while ($donnees = mysql_fetch_array($retour)) 
{
	$flag=$donnees['image_flag'];
	$body=$donnees['image_body']; 
	$first_name=$donnees['first_name'];
	$last_name=$donnees['last_name'];
?>
<td><center><?php echo $flag; ?><?php echo $body; ?><br/><p><?php echo $first_name; ?><br/><?php echo $last_name; ?></p></center></td>
 
<?php 
IF ($i%10 == 0) 
{ 
?> 
</tr> 
<tr> 
<?php 
} ?>
<?php
$i++; 
} 
mysql_close();
?> 
</tr>
</table></center>
Merci
Lorgar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2011, 02h04   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonsoir,

Déjà vos requêtes ne sont pas normalisées.

On distingue les clauses jointure aux clauses de sélection.

cad :
Code :
1
2
3
4
5
6
 
SELECT a.id,a.first_name,a.last_name,a.id_body,a.id_flag,b.id,b.image_body,c.id,c.country,c.image_flag 
FROM wof_name AS a
INNER JOIN wof_body AS b ON  a.id_body=b.id
INNER JOIN wof_flag AS c ON a.id_flag=c.id
ORDER BY a.last_name ASC
Bon ca c'est la base.
cf : http://sqlpro.developpez.com/cours/sqlaz/jointures/
Chapitre III

Pour répondre à votre question, pour faire un like sur plusieurs colonne il faut utiliser l'opérateur logique "OR".
C'est aussi simple que ca.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2011, 10h08   #3
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
MERCI

Ca marche d'enfer! Merci également pour les corrections de la requête. Le chemin est encore long pour ma part pour faire quelque chose de potable (surtout quant on part de zéro ....).

Pour les autres noobs comme moi, je mets ma requête finale (il faut mettre plusieurs fois LIKE) :

Code :
1
2
3
4
5
6
7
 
SELECT a.id,a.first_name,a.last_name,a.id_body,a.id_flag,b.id,b.image_body,c.id,c.country,c.image_flag 
FROM wof_name AS a
INNER JOIN wof_body AS b ON  a.id_body=b.id
INNER JOIN wof_flag AS c ON a.id_flag=c.id
WHERE a.first_name LIKE '%$requete%' OR a.last_name LIKE '%$requete%' OR c.country LIKE '%$requete%'
ORDER BY a.last_name ASC
Merci encore
Lorgar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h16.


 
 
 
 
Partenaires

Hébergement Web