PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 22-08-2010 21:46:44

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Tableau SQL

Bonsoir,

Je pars de cette requête qui me retourne une liste de sandwichs avec les composantes associées à chaque sandwich sous la forme d'une chaine de caractère concaténée :

[code mysql]
        SELECT
            kfet_sandwichs.sandwich,
            kfet_sandwichs_types.sandwich_type,
            kfet_sandwichs.id_sandwich,
            GROUP_CONCAT(
                DISTINCT kfet_composantes.id_composante
                    ORDER BY kfet_composantes.composante ASC SEPARATOR ','
                ) AS ids_composantes,
            GROUP_CONCAT(
                DISTINCT kfet_composantes.composante
                    ORDER BY kfet_composantes.composante ASC SEPARATOR ','
                ) AS composantes
        FROM
            kfet_sandwichs
        NATURAL JOIN kfet_sandwichs_composantes
        NATURAL JOIN kfet_composantes
        NATURAL JOIN kfet_sandwichs_types
        GROUP BY
            kfet_sandwichs.id_sandwich
        ORDER BY
            kfet_sandwichs.sandwich ASC

[/code]

D'abord, je voudrais faire la même requête mais je voudrais qu'elle prenne en compte les sandwichs qui n'ont pas de composante (la chaine concaténée est alors vide).

Je préférerais aussi qu'à la place de la chaine concaténée, j'ai un tableau que je puisse par exemple exploiter directement avec un foreach en php.

Pour faire apparaitre tous les sandwichs, ma solution consiste à rechercher tous les sandwichs, puis à imbriquer la requête pour obtenir les composantes, ce qui fonctionne bien mais je voudrais votre avis :

[code mysql]
            SELECT
                kfet_sandwichs.sandwich,
                kfet_sandwichs_types.sandwich_type,
                kfet_sandwichs.id_sandwich,
                (
                    SELECT
                        GROUP_CONCAT(
                            CONCAT(
                                    kfet_composantes.id_composante,
                                    ',',
                                    kfet_composantes.composante
                                )
                            SEPARATOR ';'
                        )
                    FROM
                        kfet_composantes
                    NATURAL JOIN
                        kfet_sandwichs_composantes
                    WHERE
                        kfet_sandwichs_composantes.id_sandwich = kfet_sandwichs.id_sandwich
                    GROUP BY
                        kfet_sandwichs_composantes.id_sandwich
                    ORDER BY
                        kfet_composantes.composante ASC
                ) AS composantes
            FROM
                kfet_sandwichs
            NATURAL JOIN
                kfet_sandwichs_types
            ORDER BY

                kfet_sandwichs.sandwich ASC

[/code]

Pour mettre sous la forme d'un array, je n'ai as trouvé de solution. De même, peut-on faire une sous-requête qui redonne plus d'un champ, et plus d'une ligne car je n'ai pas réussi.

Merci !

Hors ligne

#2 31-08-2010 10:02:31

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Tableau SQL

Bonjour,

Pour résoudre ton problème avec l'affichage de tes sandwichs qui n'ont pas de composantes, ca nécessite une structure de requête un peu plus complexe (utilisation de requêtes dérivées) et pour t'aider sur ce point j'aurais besoin de connaître la structure de tes tables.
Ensuite, pour ce qui est du foreach, il suffit de faire en PHP un implode préalable sur la colonne du group_contact avec pour séparateur le même utilisé que dans ton group_contact c'est à dire ici ';' .

PS: Je ne vois pas trop l'intérêt dans ta deuxième requete de cumuler un group_concat et un concat sur la même colonne.

Cordialement,


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 31-08-2010 11:55:12

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Tableau SQL

Finalement, j'ai utilisé une requète pour récupérer les sandwichs et une sous requête pour récupérer les composantes. Mais je me rensegnerais sur les requetes dérivées).

Ensuite, mon but était de me passer de l'implode que j'utilise maintenant.

Je fais la concaténation parce que je voulais récupérer deux champs dans ma sous-reqûete, mais je n'ai pas réussi à obtenir la syntaxe.

Merci smile

Hors ligne

#4 01-09-2010 07:19:20

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Tableau SQL

Bonjour,

GROUP_CONCAT(Champ1,', ',Champ2 SEPARATOR ';') As Alias1
Tu peux aussi faire GROUP_CONCAT(DISTINCT Champ1,', ',Champ2 SEPARATOR ';') As Alias1
CONCAT(Champ1,', ',Champ2) As Alias1

GROUP_CONCAT : J'ai mis une virgule pour séparer champ1 de champ2 mais tu peux mettre ce que tu veux tant que c'est différent de SEPARATOR.
Je te conseille de mettre un alias sur de tels champs.

Bonne continuation

Dernière modification par Jc (01-09-2010 07:20:13)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 07-09-2010 23:00:19

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Tableau SQL

Je ne trouve rien sur les requètes dérivées (c'est comme les sous-requètes ?).

Est ce que je peux avoir un lien vers un tutoriel (en français ou en anglais).

Merci !

Hors ligne

#6 21-10-2010 23:58:19

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Tableau SQL

Bonjour,

Désolé de ne pas t'avoir répondu avant, mais je profite de cet oubli pour te faire remarquer que c'est désagréable de voir un post sans suite quand on se donne du mal pour répondre/aider quelqu'un. Donc voici ton lien. Tu auras comme ça un bon aperçu des différents types de requêtes qui peuvent exister.

Une requête dérivée est par extension une requête possédant une sous-requête dans sa clause from. Attention aussi car de telles requêtes ne peuvent être corrélées comme il l'est dit dans le lien fourni.

++

Dernière modification par Jc (22-10-2010 00:00:29)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 22-10-2010 06:05:18

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Tableau SQL

Ok ! Merci pour ce lien.

Je le parcourerais.

See you !

Hors ligne

Pied de page des forums