Page 1 sur 2

Methode pour faire un répertoire

Posté : 27 nov. 2007, 16:34
par supercanard
Bonjour,

Je voudrais faire une sorte de répertoire, avoir tout simplement les lettres de l'alphabet (qui peuvent aussi être des chiffres ou des symboles) avec des liens qui permettraient de sortir les entrées de ma base donc la première lettre commence par cette même lettre.

Solution un : Des liens en "dur" et une requête
Solution deux : Une boucle qui liste toutes les premières lettre des entrées avec un DISTINCT. Affichage donc dynamique des liens

Qu'en pensez-vous ? ou que feriez vous ?

Il y a peut être même une fonction PHP que je ne connais pas qui pourrait être utile dans ce cas précis ?

Posté : 27 nov. 2007, 17:29
par Ryle
Personnellement quand je dois faire un index sur des données que je ne maitrise pas, ne sachant généralement pas à l'avance par quel caractère abscon elles vont commencer, j'opte effectivement pour une requête qui effectue un distinct et un substring du premier caractère du champ.

L'avantage c'est que l'index se met à jour de manière dynamique, et ne propose que les initiales pour lesquelles il y a au moins un réulstat :)

Posté : 27 nov. 2007, 17:56
par Victor BRITO
La fonction mkdir() ? :wink:

Posté : 27 nov. 2007, 20:31
par Ryle
arf, c'est exactement ce que je m'étais dit quand j'ai cliqué sur le sujet pour y répondre ;)

Posté : 28 nov. 2007, 00:41
par supercanard
J'en était sur qu'on allait me parler de mkdire() :lol:

Bon je vais tester tout ça (enfin pas le mkdir lol) et je repasse plus tard

Posté : 28 nov. 2007, 00:50
par supercanard
Ça aura pas été bien long

Je sais pas pourquoi je pensais à faire un DISTINCT tout à l'heure, mais en même temps Ryle toi aussi tu en parle donc il doit bien en avoir besoin d'un. Mais :

Champs nom :
Toto
Tutu
Titi

Si je fait SELECT DISTINCT nom, ben je récupère tous les noms qui ne sont pas en double, donc toute la liste. Le but et plutôt d'en récupérer un seul dans cette liste et de faire un subsrt dessus.

A moins que le substr se fasse directement dans la requête ? :?

Posté : 28 nov. 2007, 07:14
par Cyrano
Note bien qu'il a parlé d'un DISTINCT non sur le mot complet mais sur un SUBSTRING() à savoir la première lettre des mots : en d'autre terme, tu cherches les initiales, ça devrait donner une requête du genre :

Code : Tout sélectionner

SELECT DISTINCT(SUBSTRING(ta_colonne, 1, 1)) AS initiale FROM ta_table;

Posté : 28 nov. 2007, 11:42
par supercanard
Note bien qu'il a parlé d'un DISTINCT non sur le mot complet mais sur un SUBSTRING() à savoir la première lettre des mots : en d'autre terme, tu cherches les initiales, ça devrait donner une requête du genre :

Code : Tout sélectionner

SELECT DISTINCT(SUBSTRING(ta_colonne, 1, 1)) AS initiale FROM ta_table;
Ah je comprends =)
Ceci dit ça ne me retourne aucun résultat. J'ai essayé avec SUBSTR au lieu de SUBSTRING mais c'est pareil. Pourtant après recherche dans google ça à l'air juste cette requête...

Posté : 28 nov. 2007, 12:26
par Ryle
Essayes là dans phpMyAdmin... commence sans le distinct et éventuellement le nom de la colonne à côté, pour vérifier que tu récupères bien les initiales de chaque enregistrement... puis vire le nom, ajoute le distinct, etc. faut procéder par étape quand ça bug pour trouver d'où ça vient :)

Au pire donne nous la structure de ta table, la requête génétée et un bout de code :)

Pour SUBSTRING et SUBSTR, en SQL c'est la même chose ;)

Posté : 28 nov. 2007, 12:43
par supercanard

Code : Tout sélectionner

$req_test= mysql_query("SELECT nom FROM $groupes_tbl");
-> Ca c'est ok

Code : Tout sélectionner

$req_test= mysql_query("SELECT SUBSTR(nom, 1, 1) AS initiale FROM $groupes_tbl");
-> Pas de résultat, pas d'erreur

Code : Tout sélectionner

$req_test= mysql_query("SELECT DISTINCT nom FROM $groupes_tbl");
-> Ca c'est ok

Code : Tout sélectionner

$req_test= mysql_query("SELECT DISTINCT(SUBSTRING(nom, 1, 1)) AS initiale FROM $groupes_tbl");
-> Pas de résultat, pas d'erreur

Code : Tout sélectionner

$req_test= mysql_query("SELECT DISTINCT(SUBSTRING(nom, 1, 1)) FROM $groupes_tbl");
-> pas de résultat, pas d'erreur

J'ai essayé un peu tout

:?

Posté : 28 nov. 2007, 13:19
par Ryle
Quand tu dis pas de résultat, tu as essaye un mysql_num_rows() pour le vérifier ? ou tu as essayé d'afficher le code ?

euh..... une question bête... quand tu utilises l'alias "initiale" pour nommer ta colonne dans ta requête SQL... tu penses bien à récupérer la valeur dans le champ $row['initiale'] et non pas $row['nom']

Sinon quelle est ta version de MySQL ?

Posté : 28 nov. 2007, 13:25
par supercanard
Quand tu dis pas de résultat, tu as essaye un mysql_num_rows() pour le vérifier ? ou tu as essayé d'afficher le code ?

euh..... une question bête... quand tu utilises l'alias "initiale" pour nommer ta colonne dans ta requête SQL... tu penses bien à récupérer la valeur dans le champ $row['initiale'] et non pas $row['nom']

Sinon quelle est ta version de MySQL ?
$row['initiale'] Arffff ben c'est vrai que ça marche mieux que $row['nom'] :lol: :lol: :lol:

Edit : Par contre c'est sensible à la casse. Bon la faut que je regarde mais mes champs varchar sont en UTF bin c'est peut être le souci

Posté : 28 nov. 2007, 13:28
par Ryle
N'est il pas ? :)

Pour le problemme de casse, tu peux aussi faire appel à la fonction UPPER() de SQL pour mettre tout en majuscule (ou LOWER en minuscule) après le substring et avant le distinct pour n'avoir que l'un des deux :)

Posté : 28 nov. 2007, 13:40
par supercanard
Ah cool excellent le coup du UPPER. C'est génial tout ce qu'on peut faire avec une requête SQL :P

Je commence en même temps à réfléchir à la requête suivante qui va récupérer les entrées dont ma première lettre correspond à l'initiale.

Déjà une petite idée mais pas encore testé :

SELECT nom WHERE (SUBSTRING(nom, 1, 1)) == $initiale FROM $groupes_tbl

Je risque d'avoir de nouveau le problème de casse puisque cette fois il fut pas en tenir compte

Enfin je vais déjà tester ça
Merci encore pour votre grand aide :wink:

Posté : 28 nov. 2007, 13:43
par Ryle
La fonction " LIKE '$initiale%' " sera à mon avis plus éfficace ;)