Page 1 sur 1
Une requête avec plusieurs lignes par ligne
Posté : 17 avr. 2009, 15:54
par katagoto
Bonjour à toutes et à tous,
Je suis sous PostGreSQL 8.3.7, pour l'instant, et je me suis
lancé dans le conception d'un espèce de CMS ou framework,
grosso-modo un ensemble de class qui me permettrons de
faire plus vite mes sites qui seront assez simple, bref, je me
suis donc lancé dans le classe de gestion des articles,
seulement j'avais vu une option assez intéressante : les
articles à plusieurs, j'ai donc tenté de reproduire ce principe,
Mais j'ai un léger soucis : comment faire pour récupérer la
liste des auteurs lors d'un listage de plusieurs articles et ce,
dans la même requête... Plusieurs options sont venues à moi :
* Récupérer autant de ligne qu'il y a d'auteurs,
je trouve ça lourd :/
* Faire autant de colonnes qu'il y a d'auteurs possible, même
si je peux atteindre 500 colonnes je trouve ça lourd
* Faire une fonction PL/pgsql qui me retournerai une chaine
que je pourrais ainsi explosé, ça me consommerais pas mal
de ressources pour rien aussi...
* Avoir un jeu de ligne par ligne...
J'aimerais creuser la dernière piste, est-ce possible ? si oui
comment ?
Par avance merci de votre aide...
Posté : 17 avr. 2009, 16:45
par pascaltje
Hello,
Quelle est la structure des tables ?
A+
Pascal
Posté : 17 avr. 2009, 16:57
par katagoto
Oups, j'ai oublié :
Code : Tout sélectionner
CREATE TABLE articles_t_articles
(
pk_article serial NOT NULL,
titre character varying(256),
message text,
CONSTRAINT articles_t_articles_pkey PRIMARY KEY (pk_article)
)
WITH (OIDS=FALSE);
CREATE TABLE articles_r_auteurs
(
pk_auteur serial NOT NULL,
fk_auteur integer,
fk_article integer,
numero smallint,
CONSTRAINT articles_r_auteurs_pkey PRIMARY KEY (pk_auteur)
)
WITH (OIDS=FALSE);
Voilà, désolé, merci de votre aide
PS : serial NOT NULL est équivalent à integer NOT NULL auto increment sous MySQL il me semble
Posté : 17 avr. 2009, 18:58
par Sékiltoyai
Je vais répondre un peu automatiquement :
C'est une relation n-n, cela demande une nouvelle table.
Je ne vois pas pourquoi chercher à faire cette économie. Un SGBD est capable de gérer de manière optimale des tables contenant un nombre important d'enregistrements, autant l'utiliser.
Posté : 17 avr. 2009, 19:21
par katagoto
ça je le conçoit tout à fait, c'est juste que PHP n'est pas fait
pour les traitements de masse et puis, si je met les articles
en page d'accueil, la charge risque de monter vitre donc je
pense que je vais faire une fonction, non ?
Posté : 17 avr. 2009, 19:24
par Sékiltoyai
Bah, là, on parle de la base de données. En principe, si c'est bien codé, tu n'a rien à gérer en PHP. C'est à dire que je ne vois pas en quoi la différence d'organisation de tes données en base influe sur la manière de les traiter en PHP.
Posté : 17 avr. 2009, 20:00
par katagoto
J'essaye justement de bien le coder...
Mais, comme je l'ais dit plus haut, soit c'est n colonnes, soit
c'est n lignes, et si c'est n lignes, ce que je souhaite, comment
faire pour avoir un espèce de sous tableau avec les auteurs,
de manière classique, mais si je suis obligé de passer par
PL/pgsql je le ferais, mais je veux d'abord savoir si la première
solution est jouable ?
Par avance merci de votre aide...
Posté : 17 avr. 2009, 20:05
par Sékiltoyai
Bah n colonnes, quelquesoit le SGBD, c'est ultra moche.
Ensuite, j'ai jamais fait, mais je doute que, même avec PL/PGSQL, tu puisses rajouter dynamiquement des colonnes à ton résultat…
Posté : 17 avr. 2009, 20:18
par katagoto
je ne compte pas rajouter des colonnes, mais générer une
chaine genre : id1$pseudo1|id2$pseudo2...
ça ce serait jouable, mais c'est moche et et nécessite un aglo
en PHP et j'aimerais l'éviter, j'aimerais donc savoir si, par une
"simple" requête, je peux obtenir un truc du genre :
$resultat = array(
array('titre' => 'titre1', 'message' => 'mon super message qui sert à rien', 'auteurs' => array('id1' => 'pseudo1'...)),
...
)
Vous voyez ce que je veux dire ?
Par avance merci de votre aide
Posté : 17 avr. 2009, 22:40
par Sékiltoyai
Euh, bah avec une procédure stockée, tu peux obtenir ça :
array(
'titre' => 'titre1',
'message' => 'mon super message qui sert à rien',
'auteurs' => '1,9,30,2,16'
);
Voire :
array(
'titre' => 'titre1',
'message' => 'mon super message qui sert à rien',
'auteurs' => 'andré,robert,albat,nicole,albat'
);
Mais je doute que tu puisses obtenir un tableau. Ca dépend si le langage PL/PGSQL te permet de retourner des tableaux, et si le driver PGSQL te permet de récupérer des tableaux.
Déjà regarde la doc PGSQL pour les procédures stockées (ou leur équivalent).
Posté : 18 avr. 2009, 03:02
par furiouslol
Ou avec un GROUP_CONCAT ... Pour avoir une chaine avec des virgules par exemple
Posté : 18 avr. 2009, 03:36
par Sékiltoyai
Oui c'est vrai, c'est disponible sous Postgres ?
Posté : 18 avr. 2009, 09:38
par katagoto
PostGreSQL n'a pas cette fonctionnalité, directement, mais il
a array_to_string (anyarray, text) qui permet d'obtenir le
même résultat que la fonction implode en PHP...
Je vais faire quelques tests pour voir si ça fonctionne...
PS :J'étais pas loin :
Code : Tout sélectionner
SELECT
titre, message, (select array_to_string(array(select pk_auteur from auteurs where fk_article=pk_article), ', ')) as auteurs
from articles ;
Merci