Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 31/12/2011, 15h39   #1
Futur Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 18
Points : 18
Par défaut Conditions dans un WHERE

[oups je n'avais pas vu qu'une section requête existait, mais je ne pense pas avoir les droits pour déplacer le sujet :p]

Bien le bonjour!

Je viens à vous car j'ai un souci de requête!
Sur mon site j'ai un moteur de recherche qui parse la recherche et qui la compare à différentes tables.

Imaginons une recherche : "Boulanger paris".
Je vais vérifier si boulanger existe dans ma table "metier", et si paris existe dans ma table "ville". En fonction je construis ma requête.

Pour une telle demande voila à quoi ressemble ma requête :

Code :
1
2
3
4
5
6
7
8
9
SELECT 
a.id_user
FROM `user` a
LEFT JOIN `metier` b ON b.id_metier = a.id_metier 
LEFT JOIN `ville` c ON c.id_ville = a.id_ville
WHERE 
  MATCH (b.`nom`) AGAINST('boulanger')
AND
   MATCH (c.`name_geo_ville`) AGAINST('paris');
Mon souci est quand a.id_ville = 0. Ce champ n'est pas forcement rempli. Mais du coup ma requête n'affiche rien, car il n'y a pas de résultat au niveau du second MATCH AGAINST.
Comment faire pour ajouter une condition qui dise à ma requête d'appliquer le MATCH AGAINST que si mon champ a._id_ville est différent de 0?

Code :
1
2
IF(a.id_ville != 0)
   MATCH (c.`name_geo_ville`) AGAINST('paris');
Merci à vous!
laipreu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 16h07   #2
Futur Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 18
Points : 18
Je m'apporte un élément de réflexion :p
Je suis en train de voir CASE en sql, qui est une condition. Je tente donc cela :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT 
a.id_user
FROM `user` a
LEFT JOIN `metier` b ON b.id_metier = a.id_metier 
LEFT JOIN `ville` c ON c.id_ville = a.id_ville
WHERE 
  MATCH (b.`nom`) AGAINST('boulanger')
AND
  CASE
    WHEN @a.id_ville!= '0' THEN MATCH (c.`name_geo_ville`) AGAINST('paris')
  END
Mais ça ne fonctionne pas non plus :p
laipreu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 12h07   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Puisque, apparemment, ton moteur de recherche n'est pas basé sur u simple champ de saisie de texte mais sur plusieurs champs de saisie ou des choix dans des listes, construis dynamiquement ta requête en fonction de ce qu'a fait l'utilisateur.
Un truc de ce genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$sql = '
	SELECT a.id_user 
	FROM `user` a 
	WHERE 1 
';
 
$join = '';
$where = '';
 
if(isset($_POST['choix_metier']))
{
	$join .= ' LEFT OUTER JOIN metier m ON m.id_metier = a.id_metier ';
	$where .= " AND m.nom = '".mysql_real_escape_string($_POST['choix_metier'])."' ";
}
 
if(isset($_POST['choix_ville']))
{
	$join .= ' LEFT OUTER JOIN ville v ON v.id_ville = a.id_ville ';
	$where .= " AND v.name_geo_ville = '".mysql_real_escape_string($_POST['choix_ville'])."' ";
}
 
$sql .= $join.$where;
Remarques :
1) Mauvaise idée d'appeler une table 'user' car c'est un mot réservé du langage SQL !
2) J'ai supposé que els choix se faisaient dans des listes ; la recherche plain texte devient inutile.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 14h56   #4
Futur Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 18
Points : 18
Bonjour, merci pour cette réponse!

Et non ma recherche ne se fait qu'à partir d'un champ texte. Là est le souci!
Sinon je fais une requête par table et en fonction des réponses je construis ma requête, mais ça va être lourd en terme de ressource, surtout si il y a beaucoup de recherches en même temps :s

Je note pour la base user, je ne savais pas!
laipreu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h02   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par laipreu Voir le message
Et non ma recherche ne se fait qu'à partir d'un champ texte. Là est le souci!
Donc tu ne peux pas savoir a priori si ce qui est tapé dans le champ de recherche est une profession, une ville ou autre chose !
Rien ne te permet de déterminer dans quelle table il faut chercher l'info.

La seule solution rapide que je vois pour ton cas est de faire une requête qui englobe toutes les jointures externes possibles et un MATCH général sur toutes les colonnes à interroger.
As-tu essayé, dans ta première requête, de remplacer AND par OR ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h44.


 
 
 
 
Partenaires

Hébergement Web