Page 1 sur 1
jumelage de champs
Posté : 13 juin 2006, 10:33
par sorcier_clef
Bonjour,
J'ai un p'tit soucis de fusion de colonne. Je m"explique :
Je voudrais, a l'entrée sur ma page php, que les colonne de mon tableau soit classées en fonction d'une variable placé en $_GET['variable'].
Jusque là, c'est facile :
SELECT nom, ville, date etc.... FROM ma_table ORDER BY $variable DESC
mon problème vient après :
Mes clients peuvent être des entreprises ou des particuliers et, dans le cas des entreprises, le champ "nom" n'est pas rempli et c'est le champ "raison sociale" qui l'est.
pour le remplissage du tableau, c'est simple :
if ($nom == "") {
$case = $raison_sociale;
} else {
$case = $nom;
}
mais comment puis-je faire pour classer ma colonne "case" ?
Merci de votre aide !! ^^
Re: jumelage de champs
Posté : 13 juin 2006, 10:43
par Vorkosigan
mais comment puis-je faire pour classer ma colonne "case" ?
En SQL ce n'est pas possible directement, le tri se faisant uniquement sur une colonne a la fois.
Donc 2 possibilites :
- tu fais ce tri en PHP
- tu crees une table temporaire pour faire ton tri en SQL
Pour ma part, je privilegerais la solution PHP.
Re: jumelage de champs
Posté : 13 juin 2006, 11:05
par sorcier_clef
Donc 2 possibilites :
- tu fais ce tri en PHP
- tu crees une table temporaire pour faire ton tri en SQL
Pour ma part, je privilegerais la solution PHP.
En fait, je suis larguer là
Si j'ai bien compris, je dois créer un 'array' que je classe avec des if supérieur etc.... c'est bien ca ?
Re: jumelage de champs
Posté : 13 juin 2006, 12:51
par Hubert Roksor
En SQL ce n'est pas possible directement, le tri se faisant uniquement sur une colonne a la fois
Ce n'est pas tout à fait vrai, le tri se fait sur une "valeur" à la fois, mais celle-ci peut représenter le résultat d'une fonction. Et puisque une image vaut mille mots :
Code : Tout sélectionner
SELECT CASE type_utilisateur
WHEN 'societe' THEN raison_sociale
WHEN 'particulier' THEN CONCAT(nom, ' ', prenom)
ELSE 'Nom par défaut'
END AS nom_utilisateur
FROM utilisateurs
ORDER BY nom_utilisateur
Cette requête utilisera la valeur "nom_utilisateur" (qui n'existe pas dans la base) pour le tri. Ceci dit, je n'aime pas trop l'idée d'avoir deux champs différents pour la même information, à savoir : le nom à afficher. Peut-être devrais-tu retirer de la tables les champs spécifiques au type d'utilisateur, t'assurer d'avoir un champs qui détermine le type d'utilisateur (dans mon exemple : "type_utilisateur", qui pourrait être un ENUM sous MySQL) et créer une table supplémentaire pour chacun des types d'utilisateurs pour stocker les données qui leurs sont propres.
Posté : 13 juin 2006, 16:06
par sorcier_clef
Merci pour le coup de main.... ^^
Le problème c'est qu'il s'agit d'un site que je modifie et que je n'ai pas encore étudié dans son entier et je ne voudrais pas avoir à tous reprendre.
SELECT CASE nom
WHEN '' THEN raison_sociale
ELSE nom
END AS 'nom_util'
FROM abonne
ORDER BY 'nom_util'
comment récupéré mes autres infos (téléphone, Fax, adresse etc.....) ?
Désolé, j'suis vraiment débutant
Posté : 13 juin 2006, 16:30
par Hubert Roksor
je ne voudrais pas avoir à tous reprendre
À chaque fois que j'ai entendu ça la personne a fini par tout réécrire ou le projet a été abandonné. Mon conseil : calcule le temps qu'il te faut pour tout réécrire et compare-le au temps que tu vas passer à essayer de deviner ce que le programmeur avant toi a essayé de faire. Essaie de te faire une vue d'ensemble du projet avant de commencer à (ré)écrire quoi que ce soit, ça t'économisera beaucoup de temps par la suite.
comment récupéré mes autres infos
Exactement comme d'habitude. Considère tout ce qu'il y a entre "CASE" et "END" comme si c'était le nom du champs. Tu peux alors écrire:
Code : Tout sélectionner
SELECT tel, CASE un_champs WHEN 1 THEN 'un' ELSE 'autre' END AS nom_de_la_valeur, truc AS adresse, telephone
FROM table
Maintenant, si tu poses la question parce qu'il y a un champs différent pour l'adresse selon que l'utilisateur est une société ou non alors tu viens de rentrer un second pied dans les sables mouvants parce qu'il te faudra un "CASE ... END" par champs que tu veux "jumeler". (c'est un autre indice qu'il faut repenser la structure de la table)
Re: jumelage de champs
Posté : 13 juin 2006, 16:47
par Vorkosigan
Ce n'est pas tout à fait vrai, le tri se fait sur une "valeur" à la fois, mais celle-ci peut représenter le résultat d'une fonction.
Oui, honte a moi... j'ai repondu un peu vite

Posté : 13 juin 2006, 18:19
par sorcier_clef
Je pense avoir bien fait le changement mais rien ne s'affiche :
include("../connect.inc.php");
if ($_GET['classmt'] == "nom") {
$result=mysql_query("SELECT id, phone, email, CASE last_name WHEN != NULL THEN last_name END AS nom_utilisateur, zipcode, city, date_request, CASE company_name WHEN != NULL THEN company_name END AS nom_utilisateur, mail_env, type_mail, date_mail, doss_recu, doss_perdu, doss_relance, commentaires FROM abonne_n ORDER BY nom_utilisateur");
Posté : 13 juin 2006, 19:22
par Hubert Roksor
Je ne l'ai pas précisé dans mon précédent message, mais il est attendu que les utilisateurs fassent leurs propres recherches avant de poster un nouveau topic ou une nouvelle réponse. Si tu ne sais pas comment utiliser CASE (c'est normal quand on début, son utilisation n'est bizarrement pas très populaire) commence par lire sa
description dans le manuel.
Dans ton cas, tu peux aussi t'intéresser à la fonction
COALESCE(). Certains pourront te proposer d'utiliser d'autres fonctions telle que IFNULL() mais je les déconseille car elles n'existent pas forcément sur les autres serveurs de bases de données.
Donc pour en revenir à ta requête, "WHEN != NULL" ne veut rien dire pour MySQL. Si tu ne sais pas comment te servir d'une fonction, l'étape numéro 1 est vraiment d'aller voir le manuel (voir plus haut), sinon tu cours le risque de tomber par hasard sur une syntaxe qui a l'air de marcher mais qui en fait créera des bugs par la suite.
Posté : 14 juin 2006, 10:00
par sorcier_clef
Bonjour,
Je vais sûrement reprendre le site du départs et garderais l'option de tri pour la fin. Malgrés tout, merci pour votre aide, j'essaierais ce code par curiosité tout de même !
Merci à tous
