Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/09/2011, 13h27   #1
Membre éprouvé
 
Avatar de Gecko
 
Homme Antoine B
Développeur Web
Inscription : février 2011
Messages : 106
Détails du profil
Informations personnelles :
Nom : Homme Antoine B
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 106
Points : 409
Points : 409
Envoyer un message via MSN à Gecko Envoyer un message via Skype™ à Gecko
Par défaut Construction d'un arbre - récursivité

Bonjour!

J'ai un souci avec ma requête SQL:
Code SQL :
1
2
3
4
5
6
7
8
9
10
		WITH RECURSIVE children(nid,date,cid,parent,content,uid,level) AS (
			SELECT nc.news_id,nc.comment_pubdate,nc.comment_id,nc.comment_parent,nc.comment_content,nc.user_id, 1
			    FROM toine.news_comments nc
			    WHERE nc.news_id = :news_id
		    UNION ALL
			SELECT news_id,comment_pubdate,comment_id,comment_parent,comment_content,user_id, e.level+1
			    FROM toine.news_comments nc, children e
			    WHERE nc.comment_parent = e.cid
		)
		SELECT * FROM children ORDER BY cid

Les résultats ressortent plusieurs fois ce qui est embêtant. J'ai tenté d'ajouter GROUP BY mais ça me demande d'ajouter tous les arguments de children().

Du coup je sèche un peu, le but est d'éviter d'avoir plusieurs requêtes pour afficher une liste de commentaires.

Merci d'avance pour votre aide
__________________
Si ce message vous a aidé, pensez à voter pour lui!
Développe vos scripts E-Commerce et autres en PHP
N'hésitez pas à me contacter par MP, E-Mail et MSN
Gecko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 13h55   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 543
Points : 7 543
S'il s'agit d'un GROUP BY sur toutes les colonnes, autant utiliser un DISTINCT...
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 15h04   #3
Membre éprouvé
 
Avatar de Gecko
 
Homme Antoine B
Développeur Web
Inscription : février 2011
Messages : 106
Détails du profil
Informations personnelles :
Nom : Homme Antoine B
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 106
Points : 409
Points : 409
Envoyer un message via MSN à Gecko Envoyer un message via Skype™ à Gecko
Citation:
Envoyé par al1_24 Voir le message
S'il s'agit d'un GROUP BY sur toutes les colonnes, autant utiliser un DISTINCT...
Ca ne change rien

Je veut juste éliminer les doublons générés par la requête, je ne cherche pas forcément à traiter toutes les colonnes.

Je comprend pas pourquoi j'ai ce comportement
__________________
Si ce message vous a aidé, pensez à voter pour lui!
Développe vos scripts E-Commerce et autres en PHP
N'hésitez pas à me contacter par MP, E-Mail et MSN
Gecko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 15h27   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 543
Points : 7 543
Si DISTINCT ne regroupe pas les lignes, il ne s'agit donc pas de doublons complet.
La première chose à faire est de trouver la règle qui permettra d'identifier les lignes à conserver.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 15h35   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Si comment_id est unique sur toute la table, la requête parait juste.
Tu es sûr que ce n'est pas un problème avec les données plutôt?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 15h37   #6
Membre éprouvé
 
Avatar de Gecko
 
Homme Antoine B
Développeur Web
Inscription : février 2011
Messages : 106
Détails du profil
Informations personnelles :
Nom : Homme Antoine B
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 106
Points : 409
Points : 409
Envoyer un message via MSN à Gecko Envoyer un message via Skype™ à Gecko
J'ai cerné le problème, c'est level qui est pas au point.

En gros il répète le post jusqu'à atteindre le bon chiffre, voici un petit exemple en image.

http://www.toine.pro/theme/shiny_hill/etvepocrever.png

Et du coups beh c'est assez embêtant parce que je vois pas trop comment corriger ça
__________________
Si ce message vous a aidé, pensez à voter pour lui!
Développe vos scripts E-Commerce et autres en PHP
N'hésitez pas à me contacter par MP, E-Mail et MSN
Gecko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 15h47   #7
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
OK. En 2eme lecture je pense que la sous- requête avec le level à 1 n'est pas juste car elle renvoie tous les commentaires de la discussion alors qu'elle devrait renvoyer uniquement ceux qui n'ont pas de parent (colonne comment_parent à NULL ou à 0 suivant ce que tu as choisi)
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 15h57   #8
Membre éprouvé
 
Avatar de Gecko
 
Homme Antoine B
Développeur Web
Inscription : février 2011
Messages : 106
Détails du profil
Informations personnelles :
Nom : Homme Antoine B
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 106
Points : 409
Points : 409
Envoyer un message via MSN à Gecko Envoyer un message via Skype™ à Gecko
Code :
1
2
3
4
5
6
7
8
9
10
		WITH RECURSIVE children(nid,date,cid,parent,content,uid,level) AS (
			SELECT nc.news_id,nc.comment_pubdate,nc.comment_id,nc.comment_parent,nc.comment_content,nc.user_id, 0
			    FROM toine.news_comments nc
			    WHERE nc.news_id = :news_id
		    UNION ALL
			SELECT news_id,comment_pubdate,comment_id,comment_parent,comment_content,user_id, e.level+1
			    FROM toine.news_comments nc, children e
			    WHERE nc.comment_parent = e.cid
		)
		SELECT * FROM children ORDER BY date, level
Voici la structure de ma table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
                                      TABLE « toine.news_comments » 
     Colonne     |  Type   |                                Modificateurs 
-----------------+---------+------------------------------------------------------------------------------ 
 comment_id      | integer | non NULL Par défaut, NEXTVAL('toine.news_comments_comment_id_seq'::regclass) 
 comment_pubdate | bigint  | 
 comment_plus    | bigint  | non NULL Par défaut, 0 
 comment_minus   | bigint  | non NULL Par défaut, 0 
 comment_content | text    | 
 news_id         | bigint  | 
 user_id         | bigint  | 
 comment_parent  | bigint  | non NULL Par défaut, 0 
INDEX : 
    "news_comments_pkey" PRIMARY KEY, btree (comment_id)
J'ai toujours ce comportement, ou alors j'ai pas compris ce que tu m'as dis, ce qui se peut aussi ^^
__________________
Si ce message vous a aidé, pensez à voter pour lui!
Développe vos scripts E-Commerce et autres en PHP
N'hésitez pas à me contacter par MP, E-Mail et MSN
Gecko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 16h00   #9
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Ce que je voulais dire c'est remplacer
Code :
WHERE nc.news_id = :news_id
par
Code :
WHERE nc.news_id = :news_id AND comment_parent IS NULL
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 16h12   #10
Membre éprouvé
 
Avatar de Gecko
 
Homme Antoine B
Développeur Web
Inscription : février 2011
Messages : 106
Détails du profil
Informations personnelles :
Nom : Homme Antoine B
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 106
Points : 409
Points : 409
Envoyer un message via MSN à Gecko Envoyer un message via Skype™ à Gecko
Merci beaucoup, ça fonctionne et ça m'a bien dégoûté en même temps

Je ne pensais pas que la solution serait aussi simple.

Et existe-t-il un moyen de couper la requête de manière propre ?
Par exemple si j'ai 140 commentaires et que je veux qu'il y en ait 10 par page.
C'est possible de stopper au dernier enfant précédant la limite si le commentaire suivant a trop d'enfants pour la respecter ?
__________________
Si ce message vous a aidé, pensez à voter pour lui!
Développe vos scripts E-Commerce et autres en PHP
N'hésitez pas à me contacter par MP, E-Mail et MSN
Gecko est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h06.


 
 
 
 
Partenaires

Hébergement Web