IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête avec JOIN et LIMIT (recupérer 4 enfants par parent avec un max de 8 parents)


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut Requête avec JOIN et LIMIT (recupérer 4 enfants par parent avec un max de 8 parents)
    Bonjour,

    Je suis en train de bloquer sur une requête qui permet de récupérer les 8derniers albums photo et pour chaque album les 4 dernières photos rajoutées mais je bloque au niveau du limit et je me demande si je dois pas plus me pencher vers une sous requête.

    La table pour l'exemple est ainsi : ID | album | photo | pseudo
    Et dans la table :
    1 | Vacance | envac.jpg | Alain
    2 | Terre | terre.jpg | Alain
    3 | Cuisine | miam.jpg | Alain
    4 | Vacance | bateau.png |Alain

    En gros j'aimerais optimisé ceci en une seule requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $req=$wpdb->get_results("SELECT album FROM galerie WHERE pseudo='$pseudo' ORDER BY ID DESC LIMIT 8");
    foreach($req as $data)
    {
          get_results("SELECT photo FROM galerie WHERE pseudo='$pseudo' AND album=".$data->album." ORDER BY ID DESC LIMIT 4");
    }
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 640
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    C'est peut être parce qu'il est tard et que je n'ai plus les idées très claires, mais ce serait plus facile de vous répondre si vous donniez la description des 2 tables ALBUM et PHOTO
    La vous en donnez une, laquelle est-ce ?
    Donnez aussi un exemple de résultat tel que vous le souhaitez
    Et enfin, le SGBD que vous utilisez et sa version, le SQL n'est pas strictement identique en fonction des SGBD

  3. #3
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut
    Je n'ai qu'une seule table c'est la table galerie et dedans j'ai les colonnes album et photo.

    En se basant sur mon 1er exemple :
    Table galerie
    ID | album | photo | pseudo
    1 | Vacance | envac.jpg | Alain
    2 | Terre | orage.jpg | Alain
    3 | Terre | terre.jpg | Alain
    4 | Cuisine | miam.jpg | Alain
    5 | Vacance | bateau.png |Alain
    6 | Terre | feu.jpg | Alain

    Résultats attendus :
    6 : Terre - feu.jpg
    3 terre.jpg
    2 orage.jpg
    5 : Vacance - bateau.png
    1 : envac.jpg
    3 : Cuisine - miam.jpg

    Si je le fais en 2requêtes ça fonctionne, je reprend en 1er le nom de l'album et ensuite le reprend les 4dernières photos rajoutées dans l'album mais j'aimerais optimisé ça que d'avoir une requête dans un foreach...

    Pour ma version mysql c'est la 5.6 sur easyphp.

    Je vais encore chercher un peu, merci d'avance.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Mrzikel Voir le message
    Bonjour,

    Je suis en train de bloquer sur une requête qui permet de récupérer les 8derniers albums photo et pour chaque album les 4 dernières photos rajoutées mais je bloque au niveau du limit et je me demande si je dois pas plus me pencher vers une sous requête.

    La table pour l'exemple est ainsi : ID | album | photo | pseudo
    Et dans la table :
    1 | Vacance | envac.jpg | Alain
    2 | Terre | terre.jpg | Alain
    3 | Cuisine | miam.jpg | Alain
    4 | Vacance | bateau.png |Alain

    En gros j'aimerais optimisé ceci en une seule requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $req=$wpdb->get_results("SELECT album FROM galerie WHERE pseudo='$pseudo' ORDER BY ID DESC LIMIT 8");
    foreach($req as $data)
    {
          get_results("SELECT photo FROM galerie WHERE pseudo='$pseudo' AND album=".$data->album." ORDER BY ID DESC LIMIT 4");
    }
    Merci d'avance.
    LIMIT n'existe pas en SQL, c'est une merdouille à la MySQmerde.

    Il faut utiliser les fonctions de fenêtrage comme RANK() ou ROW_NUMER(). mais comme je vous soupçonne d'être sous MySQmerde, cela n'existe pas vu que ce pseudo SGBD non relationnel en est encore au balbutiement de la version 2 de 1992 du SQL !

    A lire : http://sqlpro.developpez.com/article...use-window/#LI

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Je crains que votre requête existante ne fonctionne pas non plus.

    Si vous ajoutez un nouvel album avec dix photo, alors vous n'aurez que cet album.

    Par ailleurs, votre modélisation est incorrecte, ce qui va vous compliquer encore plus la tâche, surtout sans les fonctions de classement.
    il faudrait a minima un table album ET un table photo.

    en l'état, ça donnerai quelque chose comme ceci (pas testé), qui risque fort d'être aussi moche que lent !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SELECT alb.album, pho.photo, pho.pseudo
    FROM (
    	SELECT id, album
    	FROM galerie A
    	WHERE (
    		SELECT COUNT(DISTINCT album) 
    		FROM galerie B 
    		WHERE A.album <> B.album
    		AND B.ID > A.ID
    		) < 8
    ) AS alb
    INNER JOIN (
    	SELECT album, photo, pseudo
    	FROM galerie C
    	WHERE (
    		SELECT COUNT(*)
    		FROM galerie D
    		WHERE D.album = C.album
    		AND D.ID > C.ID
    	) < 4
    ) As pho
    	ON pho.album = alb.album

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    en l'état, ça donnerai quelque chose comme ceci (pas testé), qui risque fort d'être aussi moche que lent !
    Bref, les grandes joies de MySQmerde !!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut
    Je vous remercie d'avoir participé à ce post mais vous venez avec des critiques et rien de constructif, venez plutôt avez des conseils permettant d'aboutir à une solution du problème sans quoi votre réponse n'est d'aucun intérêt.

    Limit n'existe pas en sql ? Expliquez vous ?

    Ma requête ne fonctionne pas ? Lorsque je fais un distinct sur l'album tout va parfaitement mis à part que ma requête n'est pas optimisée.

    Bon en gros soyez plus explicite car là j'ai dû échapper à quelque chose.

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par Mrzikel Voir le message
    Limit n'existe pas en sql ? Expliquez vous ?
    La langage SQL est un langage de programmation spécialisé dans la manipulation de données, qui a fait l'objet au siècle dernier d'une normalisation de sa syntaxe. Les différents éditeurs de SGBD respectent plus ou moins cette norme, n'en implémentent qu'une partie, circonviennent à certaines règles ou ajoutent des éléments.
    A ce titre, la clause LIMIT proposée par MySQL est absente de la norme.
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Mrzikel Voir le message
    Je vous remercie d'avoir participé à ce post mais vous venez avec des critiques et rien de constructif, venez plutôt avez des conseils permettant d'aboutir à une solution du problème sans quoi votre réponse n'est d'aucun intérêt.
    Je vous ais déjà aiguillé sur la solution en disant qu'il vous fallait utiliser les fonctions de fenêtrage comme RANK() ou ROW_NUMBER() qui font partie de la norme SQL et que MySQL n'implémente pas...
    Donc, une solution consiste à changer de SGBDR et votre requête s'écrira à peu près comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH T
    AS
    (
    SELECT *, RANK() OVER(ORDER BY ALBUM_DATE DESC) AS RANG_ALBUM,
              RANK() OVER(PARTITION BY ALBUM_DATE ORDER BY PHOTO_DATE DESC) AS RANG_ALBUM_PHOTO
    FROM   MaTable
    )
    SELECT *
    FROM   T
    WHERE  RANG_ALBUM <= 8
      AND  RANG_ALBUM_PHOTO <= 4;
    Ceci fonctionne sous PostGreSQL, SQL Server, Oracle...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Conversion d'une requête avec JOIN
    Par SQLNewbie dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/12/2008, 20h03
  2. Besoin de retrouner des 0 aussi dans une requête SQL avec JOIN
    Par Jean-Marc68 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 05/11/2007, 14h45
  3. [Requête] Colonne invalide avec JOIN et Group By
    Par LordTal dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/03/2007, 18h13
  4. Requête SQL avec "Join"
    Par RKU01 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 01/03/2007, 12h42
  5. Réponses: 5
    Dernier message: 10/07/2006, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo