[MYSQL]requete selective distingante

requete selective distingante [MYSQL] - SQL/NoSQL - Programmation

Marsh Posté le 24-11-2004 à 23:46:28    

Bonjour à tous,
 
je me casse la tête depuis quelques heures sur une requêtes MYSQL que je n'arrive pas à régler.
 
Voila le probleme :
-g une base qui contient en autre une colonne NOM
-je souhaite faire une requete mysql pour qu'il me renvoie la liste des lettres correpondant au premier caractère du texte contenu dans la colonne NOM et en un seul exemplaire
 
Si je prend un exemple :
- une base contient dans la colonne nom ces différentes lignes : barbier, benoit, dupont, dumont, effeil
 
Ma requete doit me renvoyer : b,d,e (et pas b,b,d,d,e)
 
Pouvez vous m'éclairer ?
 
D'avance merci.

Reply

Marsh Posté le 24-11-2004 à 23:46:28   

Reply

Marsh Posté le 25-11-2004 à 00:07:58    

J'ai trouvé :
 
$resultat = mysql_query("SELECT LEFT(`nom`,1) AS 'lettre' FROM `user` GROUP BY 'lettre' ORDER BY 'lettre'",$connexion) or die (mysql_error());

Reply

Marsh Posté le 25-11-2004 à 00:22:55    

ça devrait aussi marcher avec un DISTINCT à la place du GROUP BY.
 
$resultat = mysql_query("SELECT DISTINCT LEFT(`nom`,1) AS 'lettre' FROM `user` ORDER BY 'lettre'",$connexion) or die (mysql_error());

Reply

Marsh Posté le 04-12-2004 à 00:45:46    

J'ai fait de nouvelles corrections sur mon script et je coince de nouveau.
Alors aux données précedentes, j'ai rajoute une base contenant des infos supplementaires pour certains 'users'. Donc a chaque ligne de user ne correspond pas forcement une ligne dans user_admin.
 
Je souhaite recuperer la liste des premières lettres de chaque nom comme avant mais en prenant en compte de nouvelles choses notamment le fait que dans user_admin il n'y ai pas une colonne qui est une certaine valeur.(temp qui doit etre égal a rien)
 
Donc j'ai pondu ca :
mysql_query("SELECT LEFT(`nom`,1) AS 'lettre',id,id_user FROM `user`,`user_admin` WHERE user.id=user_admin.id_user AND temp='' GROUP BY 'lettre' ORDER BY 'lettre'",$connexion)
 
Ca me donne bien la liste des lettres sauf que ca ne me la donne que dans le cas ou l'on a une ligne dans la base usd_admin qui se refere à une ligne dans user.
 
Concretement, tous les NOM qui sont dans user mais pas dans user_admin n'apparaissent pas.
 
Et je suis bloqué...

Reply

Marsh Posté le 04-12-2004 à 20:30:01    

J'ai trouvé :
 
$resultat = mysql_query("SELECT LEFT(`nom`,1) AS 'lettre',id,id_user FROM `user`,`user_admin` WHERE (user.id=user_admin.id_user AND $temp='') OR (user.id>-1 AND isnull(user_admin.id_user)) GROUP BY 'lettre' ORDER BY 'lettre'",$connexion) or die (mysql_error());

Reply

Marsh Posté le 07-12-2004 à 11:30:04    

Elle est originale te façon de faire des jointures externes.
 
Logiquement, on utilise plutôt :
 
select distinct left(nvl(user.nom, ' '), 1) as lettre, user.id, user_admin.id_user
from user right outer join user_admin on user.id = user_admin.id_user
 
PS: La syntaxe "à la SQL" je l'aime pas, du coup je l'utilise jamais. Donc pour la syntaxe du RIGHT OUTER JOIN, ainsi que l'ordre des tables, je n'en suis pas sûr. D'un point de vue conception, c'est pas contre à mon avis plus propre que ta requête :)
 
PS: Et prefixe tes champs par le nom de la table d'où il viennent ! Pour le "nom", je ne sais pas s'il vient de user ou de user_admin ! Si t'avais un "nom" dans les deux tables, MySQL ne saurait pas plus que moi lequel prendre. Il est IMPERATIF de préfixer tes champs. D'ailleurs, c'est peut-être parceque je suis un peu puriste, mais les SGBD devraient planter lamantablement sur un "select *", sur les champs pas préfixés, et surtout, sur les INSERT sans la liste des champs. Toutes ces syntaxes sont autant de sources de bugs débiles qui font perdre un temps monstre pour les localiser.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed