IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

concatenation de champs


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut concatenation de champs
    Bonjour,

    Je reçois dans un fichier des mots correspondant a des codes de categories.

    Ex : OACCOP (le mot que je reçois)
    Je donne un exemple.

    Exemple de ce qui y a dans la table categorie_description
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    categories_id 	categories_name 	categories_code     parent_id
     
    1 	 	Bureautique Accessoires 	OAC                      0
    2 	 	Bureautique Caisses 		OCR                  0
    31 	 	Z 		                  Z                          0
    32 		Calculatrice               	CAL                    1
    33 		Copieurs                   	COP                   1
    34  	  	Fax                            	FAX                    1
    Je veux donc pouvoir concaténer les categories_code pour retrouver mon exemple au dessus.

    Pour limiter le nombre de tuples, la table est organisée comme un arbre.
    Avec un père et des fils. Je voudrais donc une requête qui me permettent de retrouver les fils, petit-fils et ainsi de suite d'un parent. Mais je connais que le numéro du père.
    Et les fils ne connaissent que le numéro du père.

    voici l'avancement je suis arriver avec cette requête a concaténer tous les codes entres eux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CONCAT(a.categories_code, b.categories_code) from categories_description a CROSS JOIN categories_description b
    Seulement ça me fait je sais pas combien de mot inutiles, moi je voudrais que les liaisons entre père et fils.

    Avancement2

    J'ai pensé a une requête comme celle ci, mais ça ne peut pas marcher parce que l'alias Concat existe pas au moment ou je veux l'utiliser dans le where.
    Je pense donc qu'il faut que je l'enlève et que j'utilise les réponses dans une autres requêtes pour voir si il y a un résultat entre le mot que je cherche et toutes ces réponses mais je bloque un peu la. Comment utiliser les réponses d'une requêtes dans une autres requêtes alors que le champ de concaténation n'existe dans aucune table?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT c.categories_id, c.parent_id, CONCAT(a.categories_code, b.categories_code) as Concat FROM osc_categories_description a, osc_categories c JOIN osc_categories_description b WHERE a.categories_id = c.categories_id AND Concat = "OACCOP"
    avancement 3

    Finalement je pense avoir trouve ma requête grâce au having.
    Mais ça ne marche que si j'ai une catégorie et une sous catégorie dans le mot, il y aurait pas moyen pour que ça marche peu importe le nombre de catégorie et sous catégorie?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT c.categories_id, c.parent_id, CONCAT(a.categories_code, b.categories_code) AS Concat FROM osc_categories_description a, osc_categories c JOIN osc_categories_description b WHERE a.categories_id = c.categories_id HAVING Concat = "OACCOP"
    Si vous pouviez m'aider
    Cordialement,

    Toshy

  2. #2
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 578
    Points : 7 355
    Points
    7 355
    Par défaut
    Bonjour.


    Tu pourrais refaire ton explication de façon simple stp?
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 035
    Points
    34 035
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par toshy Voir le message
    J'ai pensé a une requête comme celle ci, mais ça ne peut pas marcher parce que l'alias Concat existe pas au moment ou je veux l'utiliser dans le where.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT c.categories_id, c.parent_id, CONCAT(a.categories_code, b.categories_code) as Concat FROM osc_categories_description a, osc_categories c JOIN osc_categories_description b WHERE a.categories_id = c.categories_id AND Concat = "OACCOP"
    Si vous pouviez m'aider
    Cordialement,

    Toshy
    C'est parce que ton WHERE contient en fait la condition de jointure. Tu devrais plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.categories_id, c.parent_id, 
      CONCAT(a.categories_code, b.categories_code) as CodeConcat 
    FROM osc_categories_description a, osc_categories c 
      JOIN osc_categories_description b ON a.categories_id = c.categories_id 
    WHERE CodeConcat = 'OACCOP'
    A noter : Evite d'utiliser Concat en tant qu'alias parce que, comme tu le sais, c'est un mot du SQL.
    Nota 2 : Les valeur textuelles ne se mettent pas entre guillemets mais entre quotes.

    Si la requête ci-dessus ne fonctionne pas, essaie de réécrire tout le CONCAT dans le WHERE (sans l'alias bien sûr !).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Merci CinePhil de m'avoir répondu.

    J'ai essayé ta première réponse sans succès avec l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1054 - Unknown column 'CodeConcat' in 'where clause'
    J'ai donc essayé en remplaçant le CodeConcat par le CONCAT entier mais la ça donne l'erreur suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1054 - Unknown column 'a.categories_id' in 'on clause'
    Je suppose que c'est du à l'alias qui n'est pas connu dans le join.
    Mais je pense avoir trouvé avec le HAVING.

    La je cherche un moyen pour avoir une réponse peut importe le nombre de catégories dans le mot mais je crois que va falloir que j'agrandisse la requête SQL en PHP en faisant des tests.

    En tout cas merci.
    Cordialement,

    Toshy

  5. #5
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    en modifiant un peu la solution de Cinephil, j'écrirais une requête de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.categories_id, c.parent_id, CONCAT(a.categories_code, b.categories_code) AS CodeConcat 
    FROM osc_categories_description a
    JOIN osc_categories c 
    JOIN osc_categories_description b ON a.categories_id = c.categories_id 
    WHERE CONCAT(a.categories_code, b.categories_code) = 'OACCOP'
    s'il y a plusieurs niveaux, cela se complique
    un petit article sur le sujet : http://sqlpro.developpez.com/cours/arborescence/

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Bonjour Cybher,

    Je viens de tester ta requête et elle fonctionne, enfin du moins elle me donne une réponse juste. Et elle va plus vite que celle du HAVING, bon on voit pas la différence à l'œil humain mais sait-on jamais ce que ça pourrait devenir dans le futur si la BDD grossi. Donc je vais utiliser ta requête.
    Merci bien pour ta réponse.

    J'édite dessuite mon message parce que j'avais pas vu le lien.
    C'est exactement ce que je cherchais, je vais lire pour tout bien comprendre.
    Je savais pas trop comment cherché pour avoir réponse à ce problème de récursivité.
    Je te remercie infiniment.

    Cordialement,
    Toshy

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 035
    Points
    34 035
    Billets dans le blog
    14
    Par défaut
    Je n'avais pas vu qu'il y avait un mélange de syntaxe FROM a, b WHERE et FROM a JOIN b !
    Pas étonnant que ma requête n'ait pas fonctionné !

    Je rappelle que la syntaxe normalisée (depuis 1992) pour les jointures est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM tableA
    JOIN tableB ON condition de jointure
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Bonjour à tous

    Après avoir lu l'article sur
    http://sqlpro.developpez.com/cours/arborescence/

    J'ai mis en place un outil pour insérer mes catégories.
    Maintenant j'essaye de faire le select que je souhaite.
    Pour l'instant j'ai le select qui me permet d'avoir la liste des id des catégories en connaissant la feuille de l'arbre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT categories_id
    FROM   osc_categories
    WHERE  coteG <= 17
       AND coteD >= 18
    Ça me retourne donc la liste des id des catégories de la feuille jusqu'à sa racine.

    La j'essaye d'avoir le select pour récupérer la concaténation des codes de catégories à l'aide de leur id.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    SELECT CONCAT(a.categories_code, c.categories_code) 
    FROM (SELECT d.categories_id, b.categories_code
           FROM   osc_categories d, osc_categories_description b
           WHERE  d.categories_id = b.categories_id
                AND coteG < 17
                AND coteD > 18) a
    JOIN 
    	(SELECT d.categories_id, b.categories_code
    	FROM   osc_categories d, osc_categories_description b
         	WHERE  d.categories_id = b.categories_id
            	AND coteG <= 17
            	AND coteD >= 18) c 
    ON
    	a.categories_id <> c.categories_id
    Je pense donc avoir trouvé avec cette requête mais ça ne fonctionne que si il y a 2 catégories dans le mot alors que moi il y a peut y avoir x catégories dans le mot. Je pense donc que ce n'est pas faisable juste en SQL, va falloir que je fasse un genre de système avec récursivité limité vu que je sais le nombre de catégorie une fois le select du dessus effectué.

    Enfin il me restera un dernier problème à traiter, c'est d'avoir tous les mots à partir de toutes les feuilles de l'arbre et là encore je suis perdu.
    Pour cette requête j'ai essayé ca mais ca me donne une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    SELECT CONCAT(a.categories_code, c.categories_code) 
    FROM 
    	(SELECT d.categories_id, b.categories_code
    	FROM   osc_categories d, osc_categories_description b
    	WHERE  d.categories_id = b.categories_id
    		AND coteG < g.coteG
                	AND coteD > g.coteD) a 
    JOIN
    	(SELECT categories_id, coteD, coteG
    	FROM   osc_categories
    	WHERE  coteD - coteG = 1) g
    ON
    	g.categories_id = 
    JOIN 
        	(SELECT e.categories_id, f.categories_code
        	FROM   osc_categories e, osc_categories_description f
         	WHERE  e.categories_id = f.categories_id
            	AND coteG <= g.coteG
              	AND coteD >= g.coteD) c 
    ON
      	a.categories_id <> c.categories_id
    Une fois que j'aurais cette requête il me suffira de comparer cette liste avec le mot que j'ai pour savoir quels id correspondent à quel catégories
    Merci encore de m'aider
    Cordialement ,

    Toshy

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Bonjour à tous

    J'ai donc continuer mon problème avec du PHP mais évidemment je finis par avoir des problèmes de temps et de mémoire. Trop de catégories à tester.
    J'ai finalement trouver comment concaténer sous mysql avec la fonction GROUP_CONCAT.
    Il me manque juste une jointure à faire et c'est la que je bloque.

    En PHP
    je fais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    	//permet de connaitre toutes les catégories
    	$req = mysql_query("SELECT coteD, coteG FROM osc_categories");
    	if(!$req)
    	{
    		die ('Erreur de select table categorie : ' . mysql_error());
    	}
    	while($res = mysql_fetch_array($req))
    	{
    		//récupère la branche a partir des feuilles
    		$req2 = mysql_query("SELECT GROUP_CONCAT(b.categories_id SEPARATOR \"|\") categorieIds, GROUP_CONCAT( b.categories_code
    				SEPARATOR \"\" ) categorieCode
    				FROM   osc_categories a, osc_categories_description b
    				WHERE  a.categories_id = b.categories_id
    				AND coteG <= ".$res['coteG']."
    				AND coteD >= ".$res['coteD']."
    				ORDER BY coteD DESC");
     
    		if(!$req2)
    		{
    			die ('Erreur de select table categorie : ' . mysql_error());
    		}
                 //traitement pour mon programme
             }
    Je pense qu'une requête SQL peut faire ce traitement à l'aide de jointure mais j'ai beau lire des pages sur internet j'arrive toujours pas trop à comprendre la syntaxe si la jointure est complexe.

    Je pense qu'il me suffit juste de faire une jointure pour remplacer les coteG et les coteD par tous les coteG et coteD de la table, je vais essayer mais si vous pouviez m'aider la dessus.
    Cordialement,

    Toshy

Discussions similaires

  1. [interbase][SQL] concatener 2 champs dans le select
    Par Harry dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/03/2006, 06h45
  2. Concatener 2 champs
    Par j_p dans le forum Access
    Réponses: 4
    Dernier message: 21/12/2005, 16h26
  3. Concatenation de champs
    Par Samish dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/09/2005, 19h49
  4. Concatener deux champs
    Par Neo41 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2005, 16h15
  5. concatener deux champs ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 03/08/2004, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo