Une requête avec plusieurs lignes par ligne

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Une requête avec plusieurs lignes par ligne

par katagoto » 18 avr. 2009, 09:38

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

par Sékiltoyai » 18 avr. 2009, 03:36

Oui c'est vrai, c'est disponible sous Postgres ?

par furiouslol » 18 avr. 2009, 03:02

Ou avec un GROUP_CONCAT ... Pour avoir une chaine avec des virgules par exemple

par Sékiltoyai » 17 avr. 2009, 22:40

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).

par katagoto » 17 avr. 2009, 20:18

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

par Sékiltoyai » 17 avr. 2009, 20:05

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…

par katagoto » 17 avr. 2009, 20:00

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...

par Sékiltoyai » 17 avr. 2009, 19:24

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.

par katagoto » 17 avr. 2009, 19:21

ç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 ?

par Sékiltoyai » 17 avr. 2009, 18:58

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.

par katagoto » 17 avr. 2009, 16:57

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

par pascaltje » 17 avr. 2009, 16:45

Hello,

Quelle est la structure des tables ?

A+

Pascal

Une requête avec plusieurs lignes par ligne

par katagoto » 17 avr. 2009, 15:54

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...