Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête SQL complexe

    23 mai 2018 à 15:52:50

    Bonjour,

    Je débute en programmation et j'essaie de coder une requête que je trouve complexe et pas très "propre".
    Je viens vous demander votre avis pour optimiser ce que j'ai fait.

    Voici les bases : 
    - j'ai une table "fruits" qui liste tous les fruits possibles
    - chaque fruit est classé selon différents champs, dont le champ "Color"

    Voilà mon problème :
    - je veux pouvoir appeler un nombre X de fruits différents (3 dans l'exemple ci-dessous)
    - chaque fruit doit correspondre à une couleur placée dans une variable : $var1, $var2, $var3
    - si 2 fruits sont demandés dans la même couleur, la requête ne doit pas afficher de doublon 

    J'ai créé un système qui produit 3 requêtes distinctes. Et à chaque requête suivante j'applique une variable d'exclusion.

    $req = $database->prepare('SELECT id FROM fruits WHERE color = ? ORDER BY RAND() LIMIT 1');
    $req->execute(array($var1));
    $fruit1 = $req->fetch();
    $req->closeCursor();
     
    $req = $database->prepare('SELECT id FROM fruits WHERE color = ? AND id != ? ORDER BY RAND() LIMIT 1');
    $req->execute(array($var2, $fruit1['id']));
    $fruit2 = $req->fetch();
    $req->closeCursor();
     
    $req = $database->prepare('SELECT id FROM fruits WHERE color = ? AND id != ? AND id != ? ORDER BY RAND() LIMIT 1');
    $req->execute(array($var3, $fruit1['id'], $fruit2['id']));
    $fruit3 = $req->fetch();
    $req->closeCursor();

     Mon problème est que j'aimerais pouvoir effectuer cela en 1 seule requête, afin de pouvoir en combiner 10 à 20 sans devoir créer 10 à 20 requêtes uniques... :/

    Je vous remercie par avance pour votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2018 à 16:52:51

      Il y a bien cette requète

      SELECT DISTINCT ON(color) id
      FROM fruits
      WHERE color IN (?, ?, ?)
      ORDER BY color, RAND()

      Mais elle ne donnera pas le bon résultat si deux variables ont la même valeur (ex: deux fois "rouge").

      Je ne vois pas d'autre façon de faire que de passer par une procédure stockée, qui déplace ton algorithme PHP dans un algorithme PL/SQL. C'est toutefois toujours mieux qu'en PHP, car une procédure stockée étant exécuté dans une transaction, ça peut t'éviter les lectures fantômes si la base de données en modifiée en même temps qu'une requêtes est en cours (là où le code PHP donnera un résultat erroné).

      -
      Edité par Sebajuste 23 mai 2018 à 16:53:10

      • Partager sur Facebook
      • Partager sur Twitter

      Requête SQL complexe

      × 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