Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fusionner 2 requetes SQL possedants un WHERE diff

Sujet résolu
    29 novembre 2021 à 13:17:57

    Bonjour, est-il possible de fusionner en une seule requête les 2 requêtes suivantes. Le seule différence se situe dans leur WHERE.

    SELECT value FROM supertrend WHERE currency = :currency AND time < :opentime ORDER BY time DESC LIMIT 1

    SELECT value FROM supertrend WHERE currency = :currency AND time > :closetime ORDER BY time ASC LIMIT 1

    Je vous remercie d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2021 à 13:36:47

      UNION ?

      (
          SELECT value
          FROM supertrend
          WHERE currency = :currency
              AND time &lt; :opentime
          ORDER BY time DESC LIMIT 1
      ) UNION (
          SELECT value
          FROM supertrend
          WHERE currency = :currency
              AND time &gt; :closetime
          ORDER BY time ASC LIMIT 1
      )
      

      A moins de faire une jointure sur les MIN/MAX de time sur la période donnée ? Genre :

      SELECT value
      FROM supertrend
      /*LEFT*/ JOIN (
          SELECT MIN(time) AS min, MAX(time) AS max
          FROM supertrend
          WHERE currency = :currency
          AND time &lt; :opentime
          AND time &gt; :closetime 
      ) t ON supertrend.time IN(t.min, t.max)
      WHERE currency = :currency
      

      Il faut aussi voir comment doit être géré l'absence de ligne : quid si, par exemple, seule l'une des deux requêtes renvoie quelque chose, comment tu distingues, s'il y en avait besoin, à quelle (sous-)requête correspond cet unique résultat ?

      -
      Edité par julp 29 novembre 2021 à 13:52:06

      • Partager sur Facebook
      • Partager sur Twitter
        29 novembre 2021 à 14:37:32

        Merci julp pour ton aide.

        J'ai fais ceci pour obtenir ce que je recherchais :

        $select_supertrend_test = '(
            SELECT value
            FROM supertrend
            WHERE currency = :currency
                AND time < :opentime
            ORDER BY time DESC LIMIT 1
        ) UNION (
            SELECT value
            FROM supertrend
            WHERE currency = :currency
                AND time > :closetime
            ORDER BY time ASC LIMIT 1
        )';
        
        $requete = $bdd->prepare($select_supertrend_test);
        $requete->bindValue(':currency', $row['currency'], PDO::PARAM_STR);
        $requete->bindValue(':opentime', substr($candlesticks['498_opentime'], 0, -3), PDO::PARAM_STR);
        $requete->bindValue(':closetime', substr($candlesticks['498_closetime'], 0, -3), PDO::PARAM_STR);
        $requete->execute();
        
        
        $supertrend_value = array();
        
        
        foreach ($requete as $row) {
        	
        	$supertrend_value[] = $row['value'];
        	
                
            }
            
           echo $supertrend_value[0].' / '.$supertrend_value[1];
        
        
        $requete->closeCursor();
        Je sais pas si il y a plus simple...

        -
        Edité par MickaelL.L 29 novembre 2021 à 15:12:43

        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2021 à 16:14:50

          Pas besoin de réécrire fetchAll (en mode PDO::FETCH_COLUMN), tu pourrais t'épargner les lignes 22 à 30.

          Attention à la ligne 32, avec cette requête tu peux avoir moins de 2 lignes à moins vraiment d'être assuré de toujours avoir au moins une ligne pour chacune des sous-requêtes.

          • Partager sur Facebook
          • Partager sur Twitter
            29 novembre 2021 à 16:36:41

            Ok merci julp pour tes conseils toujours pertinents.
            • Partager sur Facebook
            • Partager sur Twitter

            Fusionner 2 requetes SQL possedants un WHERE diff

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown