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

Requêtes MySQL Discussion :

Problème de sous requête


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Résolu] Problème de sous requête
    Bonjour à tous ,

    Je me trouve confronté à un épineux problème, ne m'ayant que depuis peu interessé à la complexité des requêtes MySQL. Il se trouve que ma requête marche parfaitement en local, et retourne une erreur sur mon serveur (internet). Je me suis aperçu que la version de MySQL sur le serveur était inférieur à 4.1 qui autorise les sous-requêtes...

    Je voudrai réecrire la requête en évitant de me servir d'une table temporaire si possible, malheureusement je n'y arrive pas et me tourne vers une "bonne âme" qui pourra m'aider...

    Voici la requête (si vous avez besoin de plus d'information je compléterait si necessaire):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'SELECT c.`id` as `cid`, c.`name`, c.`desc`, c.`nbr_topic`, c.`nbr_msg`, c.`type`, c.`statut`, c.`secure`, t.`id` as `tid`, t.`idcat`, t.`titre`, t.`last_timestamp`, t.`last_user_id`, t.`last_msg_id`, m.`user_id`, m.`login` 
    FROM `forum_cats` AS c
    LEFT JOIN `forum_topics` AS t ON t.`idcat` = c.`id` AND t.`last_timestamp`= (SELECT MAX(`last_timestamp`) FROM `forum_topics` WHERE `idcat` = c.`id`)
    LEFT JOIN `membre` AS m ON m.`user_id` = t.`last_user_id`
    WHERE c.`aprob`="0" 
    ORDER BY c.`idcat` ASC'
    N'hésitez pas à me faire des critiques (constructives biensûr) je commence seulement à m'interesser à MySQL.

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Points : 959
    Points
    959
    Par défaut
    Si tu ne peux faire de sous-requete, est ce que tu peux alors faire 2 requetes?, ton select max en premier et le résultat tu l'utilise pour t's requete plus complexe?
    La perfection n'est pas un but, l'amélioration constante devrait l'être!
    La position des Développeurs de developpez avec les explications

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: Problème de sous requête
    Fred_76 a eu sensiblement le même problème que toi, mais il n'a pas encore essayé la solution que je lui ai suggéré (voir: http://www.developpez.net/forums/vie...er=asc&start=0)

    Avant de m'intéresser à tes jointures et aux conditions du WHERE, j'aimerais savoir si ça, ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
      B.*
     
    FROM
      forum_topics A
      JOIN forum_topics B ON B.last_timestamp=MAX(A.last_timestamp)
     
    GROUP BY A.idcat

    Citation Envoyé par Draiwn
    N'hésitez pas à me faire des critiques (constructives bien sûr) je commence seulement à m'interesser à MySQL.
    Et bien en fait, c'est loin d'être mal pour quelqu'un qui débute en MySQL: tu t'es déjà rendu compte que ça venait de la version de ton serveur (alors que d'autres auraient simplement dit: "J'comprend pô, ça marche pô")

    En plus t'as fait des jolies jointures et tout... la classe! 8) (je me demande juste pourquoi c'est toutes des jointures gauches...)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    ozzmax => Non, c'est impossible il est différent à chaque fois.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT
      B.*
     
    FROM
      forum_topics A
      JOIN forum_topics B ON B.last_timestamp=MAX(A.last_timestamp)
     
    GROUP BY A.idcat
    Ca ne marche pas malheureusement.. (même sur Mysql 4.1.9)

    J'avais déjà essayé avec un GROUP BY() mais ça ne reglait pas mon problème pour trouver le MAX(last_timestamp), je désespère un peu là
    Dès que je met un MAX dans la requête ça foire inmencablement.


    Et pour les LEFT JOIN, ça ne marche pas autrement.


    Edit:
    J'ai essayé ça mais la table forum_topics, ne me retourne plus rien mais le reste marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'SELECT MAX(t1.last_timestamp) as max, c.`id` as `cid`, c.`name`, c.`desc`, c.`nbr_topic`, c.`nbr_msg`, c.`type`, c.`statut`, c.`secure`, t.`id` as `tid`, t.`idcat`, t.`titre`, t.`last_timestamp`, t.`last_user_id`, t.`last_msg_id`, m.`user_id`, m.`login` 
    FROM forum_topics AS t1, forum_cats AS c
    LEFT JOIN forum_topics AS t ON t.`idcat` = c.`id` AND t.last_timestamp = t1.last_timestamp
    LEFT JOIN membre AS m ON m.`user_id` =  t.`last_user_id`
    WHERE c.`aprob`="0" 
    GROUP BY c.`idcat`
    ORDER BY c.`idcat` ASC'

  5. #5
    Membre éprouvé
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Points : 959
    Points
    959
    Par défaut
    Citation Envoyé par Draiwn
    SELECT
    B.*

    FROM
    forum_topics A
    JOIN forum_topics B ON B.last_timestamp=MAX(A.last_timestamp)

    GROUP BY A.idcat

    Ca ne marche pas malheureusement.. (même sur Mysql 4.1.9)

    J'avais déjà essayé avec un GROUP BY() mais ça ne reglait pas mon problème pour trouver le MAX(last_timestamp), je désespère un peu là
    Dès que je met un MAX dans la requête ça foire inmencablement.
    C'est une proposition mais, p-e que le (Select MAX...) tu devrais le faire dans le WHERE de ta requete globale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE c.`aprob`="0" AND B.last_timestamp=(SELECT MAX...)
    La perfection n'est pas un but, l'amélioration constante devrait l'être!
    La position des Développeurs de developpez avec les explications

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui ça marche avec une sous requête, mais je veux que ça marche avec MySQL < 4.1 donc sans sous requêtes

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé quelque chose avec HAVING(), mais ça me retourne qu'une partie des résultats je comprend pas très bien comment ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'SELECT c.`id` as `cid`, c.`name`, c.`desc`, c.`nbr_topic`, c.`nbr_msg`, c.`type`, c.`statut`, c.`secure`, t.`id` as `tid`, t.`idcat`, t.`titre`, t.`last_timestamp`, t.`last_user_id`, t.`last_msg_id`, m.`user_id`, m.`login` 
    FROM forum_cats AS c
    LEFT JOIN forum_topics AS t ON t.`idcat` = c.`id`
    LEFT JOIN membre AS m ON m.`user_id` =  t.`last_user_id`
    WHERE c.`aprob`="0" 
    GROUP BY c.`idcat`
    HAVING t.`last_timestamp` = MAX(t.`last_timestamp`)
    ORDER BY c.`idcat` ASC'

  8. #8
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Bonjour,

    Pourrais-tu essayer cette requête pour voir ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT c.`id` as `cid`, c.`name`, c.`desc`, c.`nbr_topic`, c.`nbr_msg`, c.`type`, c.`statut`, c.`secure`, t.`id` as `tid`,
           t.`idcat`, t.`titre`, t.`last_timestamp`, t.`last_user_id`, t.`last_msg_id`, m.`user_id`, m.`login`
    FROM `forum_cats` AS c
          LEFT JOIN `forum_topics` AS t
               ON t.`idcat` = c.`id`
          LEFT JOIN `membre` AS m ON m.`user_id` = t.`last_user_id`
          LEFT JOIN `forum_topics` AS t2 ON (t.`idcat`=t2.`idcat`)
    WHERE c.`aprob`="0"
    GROUP BY c.`id` as `cid`, c.`name`, c.`desc`, c.`nbr_topic`, c.`nbr_msg`, c.`type`, c.`statut`, c.`secure`, t.`id` as `tid`,
             t.`idcat`, t.`titre`, t.`last_timestamp`, t.`last_user_id`, t.`last_msg_id`, m.`user_id`, m.`login`
    HAVING t.`last_timestamp` = MAX(t2.`last_timestamp`)
    ORDER BY c.`idcat` ASC
    Pensez au tag

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour et merci

    J'avais après m'être bien énervé sur cette requête essayé de mettre tout les champ selectionné dans le GROUP BY, puis faire une jointure de la table sur elle même mais ça n'avais pas marché... comme quoi en inssistant

    Merci à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Oracle 10g] Problème Union-sous requêtes-group by
    Par slobberbone dans le forum SQL
    Réponses: 2
    Dernier message: 17/09/2007, 18h16
  2. Problème de sous requête (retour d'une seule valeur)
    Par ero-sennin dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/06/2006, 11h12
  3. Problème de sous-requêtes
    Par R'SKaP dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/05/2006, 19h39
  4. Problème de sous requête
    Par espadon1 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/05/2006, 15h20

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