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 :

Vérifier si une ligne d'une table existe dans une autre


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    prevention incendie
    Inscrit en
    Mai 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : prevention incendie

    Informations forums :
    Inscription : Mai 2019
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Vérifier si une ligne d'une table existe dans une autre
    Bonsoir,

    Voilà je souhaiterais comparer 2 tables : Proposition et Reponse . en fait Proposition correspond aux différentes propositions pour une question donnée (systeme QCM). Reponse est une table créée à partire des propositions cochées par l'utilisateur. Mon but ici est de vérifier si les lignes de propositions avec le champ "vrai" = 1 (bonnes reponses) sont toutes présentes dans la table Reponse (sinon -1 à chaque manquement) . Ma table Proposition a les champs suivant id, question_id, vrai etc.. ma table Reponse quant à elle reprend question_id, proposition_id ... Comment construire la requête?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Pour étudier la question, il nous faudrait une définition suffisante de la structure des tables.
    Quelle est la clé primaire des tables Réponse et Proposition ?

    Si je comprends bien le besoin, il faudrait connaître les lignes à vrai de la table Proposition qui sont absentes de la table Réponse et les lignes de la table Réponse dont la correspondance dans Réponse n'est pas à vrai.
    Une simple jointure externe entre ces deux tables devrait répondre à la question.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    prevention incendie
    Inscrit en
    Mai 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : prevention incendie

    Informations forums :
    Inscription : Mai 2019
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Oui effectivement j'ai trouvé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $entityManager = $this->getEntityManager();
        $query = $entityManager->createQuery(
            " SELECT p
            FROM App\Entity\Proposition p
            JOIN App\Entity\Reponse r
            WITH p.id = r.idProposition       
            WHERE p.vrai = '1' ");
     
        // returns an array of Product objects
        return $query->execute();
    Reste plus qu'à remplacer le join par un left join et à faire un count (encore faut il savoir comment )

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT  prp.id_question
        ,   prp.id_proposition
        ,   sum(CASE
                WHEN prp.vrai = 1 AND rep.id_proposition IS NOT NULL
                    THEN 1 -- Bonne réponse
                WHEN prp.vrai = 1 AND rep.id_proposition IS NULL
                    THEN 0 -- Réponse correcte "oubliée"
                WHEN prp.vrai = 0 AND rep.id_proposition IS NOT NULL
                    THEN -1 -- Mauvaise réponse
            END) AS  points
    FROM    proposition prp
        LEFT JOIN
            reponse     rep
            ON  prp.id_proposition  = rep.id_proposition
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre à l'essai
    Homme Profil pro
    prevention incendie
    Inscrit en
    Mai 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : prevention incendie

    Informations forums :
    Inscription : Mai 2019
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT(p.id)
            FROM App\Entity\Proposition p
            LEFT JOIN App\Entity\Reponse r
            WITH r.idProposition IS NULL     
            WHERE p.vrai = '1'
    Mais il me retourne le nombre 10 (10 étant le nombre de propositions vrai) alors que je devrais avoir 9 (vu que pour le test je coche toujours une reponse vrai, au milieux de reponses fausses)

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    JOIN...WITH n'est pas conforme au langage SQL normalisé.
    Avant de faire un COUNT, il est préférable de regarder les lignes retournées par la requête pour s'assurer qu'elles répondent à la question...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre à l'essai
    Homme Profil pro
    prevention incendie
    Inscrit en
    Mai 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : prevention incendie

    Informations forums :
    Inscription : Mai 2019
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    JOIN...WITH n'est pas conforme au langage SQL normalisé.
    Avant de faire un COUNT, il est préférable de regarder les lignes retournées par la requête pour s'assurer qu'elles répondent à la question...
    En remplaçant WITH par ON, j'ai une Error : Expected end of string, got 'ON'... De plus avec le LEFT JOIN j'ai dans tous les cas un array de 10 occurrences(correspond aux nombres de propositions vrai = 1) , mais je ne vois aucune distinction entre NULL et non NULL

  8. #8
    Membre à l'essai
    Homme Profil pro
    prevention incendie
    Inscrit en
    Mai 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : prevention incendie

    Informations forums :
    Inscription : Mai 2019
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    C'est bon j'ai trouvé en faisant comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT p
    FROM App\Entity\Proposition p
    LEFT JOIN App\Entity\Reponse r 
    WITH p.id=r.idProposition   
    WHERE p.vrai = '1' AND  r.idProposition IS NULL
    reste plus qu'à compter les NULL

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    C'est quoi ce SGBD qui accepte des noms de tables sous cette forme et dont les prédicats de jointure s'écrivent avec "WITH"

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Sans aucun doute MySQmerde qui fait n'importe quoi et par principe ne renvoi pas d'erreur, mais des données fausses….

    Cela satisfait en général les crétins qui n'ont pas étudié le langage SQL….

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Membre à l'essai
    Homme Profil pro
    prevention incendie
    Inscrit en
    Mai 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : prevention incendie

    Informations forums :
    Inscription : Mai 2019
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    C'est quoi ce SGBD qui accepte des noms de tables sous cette forme et dont les prédicats de jointure s'écrivent avec "WITH"
    MySql en effet (je suis sur le framework symfony) : le ON me genere des erreurs et le nom des tables doit faire référence à "l'entity"

  12. #12
    Membre à l'essai
    Homme Profil pro
    prevention incendie
    Inscrit en
    Mai 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : prevention incendie

    Informations forums :
    Inscription : Mai 2019
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Sans aucun doute MySQmerde qui fait n'importe quoi et par principe ne renvoi pas d'erreur, mais des données fausses….

    Cela satisfait en général les crétins qui n'ont pas étudié le langage SQL….

    A +
    Les données renvoyées ne sont pas fausses (en tout cas dans mon cas) et désolé si on ne peut pas être un "expert" en tout ... pour l'instant je ne suis qu'un "crétin" du sql...

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2007, 11h48
  2. Tester si une table existe dans une base access
    Par codial dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/03/2007, 08h39
  3. Réponses: 1
    Dernier message: 23/10/2005, 00h55
  4. comment savoir si une table existe dans la base?
    Par isa21493 dans le forum ASP
    Réponses: 6
    Dernier message: 01/09/2005, 17h09
  5. Réponses: 2
    Dernier message: 20/05/2005, 10h18

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