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 :

Double Sous requête


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    AFTT
    Inscrit en
    Janvier 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : AFTT

    Informations forums :
    Inscription : Janvier 2015
    Messages : 32
    Points : 18
    Points
    18
    Par défaut Double Sous requête
    Bonjour,

    Voici mon problème :

    Table "Match"
    ID - Name - Id_Home - Id_Away
    99 - JANE - 1 - 2
    100 - STEPH - 2 - 1

    Table "Histo"
    ID - ID_Player - POINTS
    50 - 1 - 1800
    51 - 1 - 1850
    89 - 2 - 1900
    90 - 2 - 1950

    J'ai besoin de faire une requête qui m'affiche ceci :

    JANE - 1850 - STEPH - 1950

    En gros c'est un match entre deux joueuses et je dois aller rechercher les points les plus récents de la table histo.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    		FROM Match 
    		INNER JOIN Histo AS HistoHome ON Match.Id_Home = HistoHome.ID_Player
    		INNER JOIN Histo AS HistoAway ON Match.Id_Away = HistoAway.ID_Player
    Le souci c'est que ça me retourne les deux valeurs à chaque fois, alors que je ne veux que la valeur avec l'ID la plus haute pour chaque table.

    J'ai testé avec des sous requête mais impossible d'y arriver.

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    En gros c'est un match entre deux joueuses et je dois aller rechercher les points les plus récents de la table histo.
    Il y a un problème de modèle. De plus tu parles de "points les plus récents" mais je ne vois pas de colonne temporelle.

    Pour avoir les points du dernier match entre 2 joueurs donnés :

    players
    -------------
    id (PK)
    name

    matches
    -------------
    id (PK)
    played_at (horodatage de la recontre)
    player_home_id (FK => players.id)
    player_away_id (FK => players.id)
    home_score
    away_score

    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ALL ph.name AS "Joueur domicile", m.home_score AS "Score domicile", pa.name AS "Joueur extérieur", m.away_score AS "Score extérieur"
    FROM matches AS m
    INNER JOIN players AS ph ON m.player_home_id = ph.id
    INNER JOIN players AS pa ON m.player_away_id = pa.id
    WHERE (ph.id, pa.id) IN ((123, 234), (234, 123)) -- Rencontre domicile/extérieur ou extérieur/domicile
    ORDER BY m.played_at DESC
    LIMIT 1
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre à l'essai
    Homme Profil pro
    AFTT
    Inscrit en
    Janvier 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : AFTT

    Informations forums :
    Inscription : Janvier 2015
    Messages : 32
    Points : 18
    Points
    18
    Par défaut
    Merci pour tes infos,

    Pour la colonne temporelle, je me base sur l'ID (le plus élevé, contient le résultat le plus récent).

    Pr contre peux-tu m'expliquer cette ligne : WHERE (ph.id, pa.id) IN ((123, 234), (234, 123)) -- Rencontre domicile/extérieur ou extérieur/domicile

    Merci beaucoup

    Mathieu

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    Pour la colonne temporelle, je me base sur l'ID (le plus élevé, contient le résultat le plus récent).
    Ce n'est pas une bonne idée car :
    1. Tu obtiens plutôt un ordre d'enregistrement que de rencontre (mais même pour cet indicateur c'est une mauvaise idée)
    2. Tu perds l'info de la date à laquelle a eu lieu la rencontre
    3. Un ID ne doit pas servir à autre chose qu'à identifier une ligne, et dans l'absolu la valeur pourrait être quelconque (ex. UUID)

    Pr contre peux-tu m'expliquer cette ligne : WHERE (ph.id, pa.id) IN ((123, 234), (234, 123)) -- Rencontre domicile/extérieur ou extérieur/domicile
    Ces 2 clauses sont équivalentes :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    WHERE (ph.id = 123 AND pa.id =234) OR (ph.id = 234 AND pa.id =123)
     
    ...
    WHERE (ph.id, pa.id) IN ((123, 234), (234, 123))

    C'est pour obtenir les rencontres des 2 joueurs, qu'ils aient joué à domicile ou à l'extérieur.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Citation Envoyé par jasinskimathieu Voir le message
    Pour la colonne temporelle, je me base sur l'ID (le plus élevé, contient le résultat le plus récent).
    Si la valeur de la colonne ID est attribuée par le SGBD, c'est à dire un type IDENTITY (SQL Server, DB2), auto_increment (MySQL), serial (PostGreSQL) ou number (Oracle) alors cette affirmation est fausse. Il n'y a aucune garantie que l'ID de valeur la plus élevée soit toujours celui le plus récent. C'est souvent le cas, mais ce n'est pas une règle.
    Avoir une table d'historique sans horodatage n'a pas de sens !

    Pour obtenir la ligne la plus récente ou la plus ancienne, un horodatage ou une colonne dont la valeur chronologique est garantie est obligatoire, voyez comment faire dans mon blog ICI

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/10/2009, 15h55
  2. [PHP-JS] Requête s'exécutant en double sous Mozilla
    Par Juanito-Toto dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2007, 09h54
  3. Requêtes et sous requêtes
    Par lau2nyce dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2004, 15h14
  4. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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