Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Retourner aux forums || Retourner au forum Programmation.SQL

Programmation.SQL : Liaison N à N

Posté par Greg () le 14 mars 2008
Bonjour,

J'ai une petit problème en SQL (sur base MySql, InnoDb).

Je m'explique, j'ai 2 tables : actions et fiches :

action (id_action, nom)
fiches (id_fiche, nom)

Comme une action peut être dans plusieurs fiches j'ai fait une table de liaison :

transi (id_action,id_fiche) pour faire l'association.

Maintenant je souhaite récupérer sur une ligne de résultat :

id_action et les ids de toutes les fiches associées et là je ne sait pas comment m'y prendre car je sais récupérer ça sur n lignes (n=nombre de fiches par action) mais pas sur une ligne.

J'espère être clair...

Merci d'avance...

Pilouz

> Lire le message (6 commentaires, moyenne: 3,2).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

les bases...

Posté par fcartegnie () le 14/03/2008 à 22:56. (lien). Évalué à 5.

base de données "relationelle" et SQL langage d'origine algébrique
1 ligne = 1 tuple

Les jointures sont itératives, 1 ligne = 1 opération sur les tuples
Il ne peut pas y avoir plusieurs réponses par ligne. D'ailleurs si ce que tu veux était possible, on ne pourrait plus exploiter les résultats produits.

genre ca ?

Posté par nicodache () le 15/03/2008 à 00:47. (lien). Évalué à 3.

Chère base de donnée,

merci de me retrouver tout ce que tu sais
    dans ta table fiches
    pour le cas ou l'action est _celle-ci_,
        et que tu trouves des informations dans ta table de transition des liens entre _cette_action et celle dans la table des actions,
        ainsi qu'une condition d'intégrité encore ailleurs
(si tu es motivée, tu peux aussi trier par nom de fiche).

Cordialement,
Merci;

A triter dans le langage hôte.

Posté par Jean Boussier () le 15/03/2008 à 11:05. (lien). Évalué à 2.

Comme dit plus haut tu ne peux pas faire ça directement en SQL.

Il faut que tu le traite avec un langage de programmation, exemple en php ça donnerai :


$sql = 'SELECT * FROM transi SORT BY id_action';
$result = mysql_db_query($sql);

//et ensuite tu boucle pour créer le tableau désiré

$currentId;
$actions = array();

while($assoc = mysql_fetch_assoc($result)) {
$actions[$assoc['id_action']][] = $assoc['id_fiche'];
}



Enjoy!

A la mimine

Posté par Kerro () le 15/03/2008 à 14:13. (lien). Évalué à 2.

Comme indiqué plus haut, il n'y a pas de solution purement SQL pour ton problème. Sauf en utilisant des dialectes non standards (par exemple c'est faisable avec SQL Server et Oracle).

1- récupérer le résultat de ta requête SQL
2 - coller bout à bout toutes les lignes

--
Qui a existé en premier: le compilateur ou son code source ?
  • [^]Re: A la mimine

    Posté par Christophe --- () le 15/03/2008 à 15:24. (lien). Évalué à 5.

    A propos de dialectes non-standards, voici quelques pistes:

    Du côté de MySQL il peut y avoir la fonction CONCAT_WS. Note bien que je n'ai pas testé:

    http://dev.mysql.com/doc/refman/4.1/en/string-functions.html(...)

    SELECT id_action, CONCAT_WS(',', CAST(id_fiche AS CHAR)) AS fiche
    FROM transi GROUP BY id_action;


    ...avec pour effet secondaire de retourner un texte, à reconvertir derrière... Enfin, si CONCAT_WS fonctionne dans ce contexte :-/

    Sinon, tu peux le faire avec PostgreSQL de la manière suivante, que j'ai vérifié:

    Préparation:
    CREATE AGGREGATE join (
    BASETYPE = INT,
    SFUNC = array_append,
    STYPE = INT[],
    INITCOND = '{}'
    );


    Et à l'utilisation:
    SELECT id_action, join(id_fiche)
    FROM transi
    GROUP BY id_action;


    L'avantage de cette méthode, c'est qu(il te retourne un tableau, donc si derrière ton front-end sait les gérer, c'est parfait. (sinon, tu auras un texte avec les valeurs entre virgules...)

    Enfin, si tu est un peu plus joueur, car après tout les nombres sont bon pour l'ordinateur, mais toi ce sont les données qui t'interessent, tu peux faire ceci:

    Préparation:
    CREATE PROCEDURAL LANGUAGE plpgsql;

    CREATE FUNCTION join_text_merge(TEXT[]) RETURNS TEXT
    LANGUAGE 'plpgsql' AS '
    BEGIN
    RETURN array_to_string($1, \', \');
    END;
    ';

    CREATE AGGREGATE join (
    BASETYPE = TEXT,
    SFUNC = array_append,
    STYPE = TEXT[],
    FINALFUNC = join_text_merge,
    INITCOND = '{}'
    );


    Et tu peux ensuite faire de requetes plus intelligentes:
    SELECT actions.nom AS action,
    join(fiches.nom) AS fiches
    FROM transi, actions, fiches
    WHERE transi.id_action = actions.id_action
    AND transi.id_fiche = fiches.id_fiche
    GROUP BY action;


    Note: bonus, les deux fonctions join peuvent vivrent ensemble.

Merci

Posté par Greg () le 15/03/2008 à 22:06. (lien). Évalué à 2.

Merci à tous,

j'ai effectivement fini par faire ça à la mimine, ça multiplie le nombre de requêtes (une par action) pour identifier les fiches correspondantes, mais ça marche.

Greg.

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.SQL