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 :

Requete imbriquée, un peu de géométrie


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Requete imbriquée, un peu de géométrie
    Bonjour,

    Etant entrain de m'arracher les cheveux, je m'engage à nommer chevalier la personne qui trouvera la solution à la question suivante. J'ai simplifié au maximum pour ne mettre en valeur que ce qui me pose problème.

    On a deux tables. L'une est appelée "segments" et répertorie des couples de points A et B formant des segments dont la longueur est comprise entre 1 et 1000 mètres. L'autre est appelée "points" et stocke les coordonnées X et Y de chaque point. Voici les tables :

    segments
    IDsegment /* clé primaire */
    IDpointA /* fait référence à un IDpoint de la table points */
    IDpointB /* idem */

    points
    IDpoint /* clé primaire */
    X /* abscisse */
    Y /* ordonnée */

    Comment, avec une seule requête SQL, récupérer tous les segments dont la longueur est inférieure ou égale à 100 mètres ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 109
    Points : 28 434
    Points
    28 434
    Par défaut
    Pourrais tu nous montrer la requête que tu as déjà commencé à développer ?
    Nous pourrons t'aider à la mettre au point.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Voici la bidouille très basique que j'utilise pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM segments,points
    WHERE 
    points.IDpoint = segments.IDpointA
    OR
    points.IDpoint = segments.IDpointB
    Mais ça me donne deux lignes pour chaque IDsegment, l'une avec les coordonnées de A, l'autre avec les coordonnées de B.
    Je me débrouille ensuite pour trouver les longueurs de chaque segment via php mais c'est une usine à gaz !

    Il serait tellement plus simple d'obtenir une seule ligne par IDsegment, avec les coordonnées du point A et celles du point B

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Pour ne pas avoir le segment en double dans la clause WHERE il faut utiliser deux fois la table points et remplacer le OR par un AND.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 109
    Points : 28 434
    Points
    28 434
    Par défaut
    Il te faut une double jointure.
    Par ailleurs, en utilisant des jointures normalisées, ta requête sera plus lisible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  s.idsegment
        ,   a.x AS  abcisse_a
        ,   a.y AS  ordonnee_a
        ,   b.x AS  abcisse_b
        ,   b.y AS  ordonnee_b
    FROM    segments    AS  s
        INNER JOIN
            points      AS  a   // points A
            ON  s.idpointa  = a.idpoint
        INNER JOIN
            points      AS  b   // points B
            ON  s.idpointb  = b.idpoint
    Cette requête te donne les coordonnées des points A et B pour chaque segment. Il ne te reste plus qu'à évaluer la longueur du segment (niveau collège) et appliquer le filtre correspondant...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    MERCI ALAIN ! Comme promis je te nomme chevalier...
    Voici donc la requête complète.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  s.IDsegment
        ,   a.X
        ,   a.Y
        ,   b.X
        ,   b.Y
    FROM    segments    AS  s
        INNER JOIN
            points      AS  a   // points A
            ON  s.IDpointA  = a.IDpoint
        INNER JOIN
            points      AS  b   // points B
            ON  s.IDpointB  = b.IDpoint
    WHERE SQRT(POWER(a.X-b.X,2)+POWER(a.Y-b.Y,2))<=100

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

Discussions similaires

  1. [SQL] requetes inbriquées un peu plus complexe.
    Par Devil666 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2005, 11h06
  2. Requete imbriquée, oui mais...
    Par zax-tfh dans le forum Requêtes
    Réponses: 6
    Dernier message: 24/03/2005, 01h48
  3. Equivalent d'une requete imbriquée ??
    Par webtheque dans le forum Requêtes
    Réponses: 8
    Dernier message: 31/08/2004, 10h07
  4. Requetes imbriquées et jointures
    Par Emile Le Tueur* dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/03/2004, 23h12
  5. Requete imbriquée sur Firebird ou Interbase
    Par Thib dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 09h00

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