Bonjour,

J'ai plusieurs tables mysql :

  • commandes
  • users
  • atelier
  • positions
  • groupements
Je souhaite lister toutes les commandes se trouvant dans ma table "COMMANDES"
COMMANDES : id agent____id commande atelier____id positions____ids grps____ids 1 2 intitule commande 1 1 1,2,5 null 2 2 intitule commande 2 1 2,3,10 9 3 1 intitule commande 3 1 null 22,3

etc...

Donc j'ai ma requête :

$req="
    SELECT
        cmd.id as cmd_id,
        cmd.commande,
        user.agent
    FROM
        COMMANDES
    LEFT JOIN users AS user ON user.id = cmd.agent___id
    LEFT JOIN atelier AS at ON at.id = cmd.atelier___id ";

Jusque là tout fonctionne nickel.

Dans ma table "COMMANDES" j'ai les colonnes "positionsid" et "gprsid" qui contiennent les ids des positions et des groupements des tables respectives "positions" et "groupement"

Ce que je voudrais obtenir au final c'est un array qui se construirait de la façon :

array (
    '0' =>
        array (
            'cmd_id' => '1',
            'commande' => 'intitule commande 1',
            'agent' => 'mr smith',
            'positions' =>
                array(
                    '0' => array('position_id' => '1', 'position' => 'Nettoyage'),
                    '1' => array ('position_id' => '2', 'position' => 'Nettoyage avancé'
                 ),
            'groupement' => null
        )
    '1' => 'etc.......'
)

Je ne sais pas du tout si c'est possible de créer une requête retournant un tel résultat.

Si la représentation du résultat voulu ci-dessus n'est pas très clair on peut imaginer que je voudrais faire une requête du genre (j'entends bien que cette écriture n'est pas possible '_' ):

$req="
    SELECT
        cmd.id as cmd_id,
        cmd.commande,
        user.agent,
        (SELECT po.id AS  position_id, po.position FROM positions AS po WHERE po.id IN (cmd.positions____id)),
        (SELECT grp.id AS  grp_id, grp.grp FROM groupements AS grp WHERE grp.id IN (cmd.grps____id))
    FROM
        COMMANDES
    LEFT JOIN users AS user ON user.id = cmd.agent___id
    LEFT JOIN atelier AS at ON at.id = cmd.atelier___id ";

Si toutefois c'est possible, toute aide est la bienvenue.

3 réponses


hello,
d'emblée comme ça, cela me semble compliqué avec une requête sql car ton champ positions_id est une chaine implode (1,2,5)....
pourquoi ne pas te créer 2 tables positions et groupes avec un champ commande_id pour faire la jointure ?

PLJerem
Auteur

Bonjour saibe,

J'étais parti sur le format "xx,xx,xx" car utilisable avec une condition du type "WHERE colonne IN (xx,xx,xx,xx,x,x)".

Pour la création des tables pour la jointure, j'ai beaucoup hésité mais c'est le nombre d'enregistrements générés qui m'a freiné.

J'ai environ 30 commandes avec environ 75 positions ou groupements générés par jour.
Le volume d'enregistrements me paraît énorme.

re,
je ne connaissais pas le IN (intéressant ;) merci)
j'ai fait quelques tests... sans boucle php je n'arrive pas à récupérer toutes les infos... c un pb intéressant, parce qu'il est logique :)
j'ai tenté de le prendre à l'envers et récupérer toutes les positions fct d'une commande... c 1 idée... ;)

après, il me semble difficile d'obtenir le format que tu demandes avec une seule requête SQL... je peux me tromper...
mais je verrai davantage la récupération d'une table jointée avec ton cmd_id sur plusieurs rows et une tite routine toute simple pour fabriquer ton array formaté...
désolé de ne pouvoir t'aider. je passe la main à plus expert (mais je regarde quand même ;))
++