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

PHP & Base de données Discussion :

[SQL] Vérifier si 2 requêtes sont identiques


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 86
    Points : 44
    Points
    44
    Par défaut [SQL] Vérifier si 2 requêtes sont identiques
    Salut j'aimerais savoir si c'est possible de verifier si le contenu de 2 requetes est identiques

    ex:
    table1 j'ai une primary key avec nomQuestion
    question 1 niveau1
    question 2 niveau3
    question 3 niveau3

    2ieme table j'ai une double primary key login nomQuestion lu
    bob question1 nonlu
    bob question2 lu
    bob question3 nonlu
    bobby question1 nonlu
    bobby question2 lu
    bobby question3 lu

    Si je fais -Select nomQuestion from table1;
    -Select nomQuestion from table2 where login=`bob`;
    la requete rapporte les meme champs
    j'ai penser a faire un num rows mais ca pas rapport puisque pas a cause que ya le meme nombre de ligne que c les meme champs...

    merci

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par darkbob
    Salut j'aimerais savoir si c'est possible de verifier si le contenu de 2 requetes est identiques

    ex:
    table1 j'ai une primary key avec nomQuestion
    question 1 niveau1
    question 2 niveau3
    question 3 niveau3

    2ieme table j'ai une double primary key login nomQuestion lu
    bob question1 nonlu
    bob question2 lu
    bob question3 nonlu
    bobby question1 nonlu
    bobby question2 lu
    bobby question3 lu

    Si je fais -Select nomQuestion from table1;
    -Select nomQuestion from table2 where login=`bob`;
    la requete rapporte les meme champs
    j'ai penser a faire un num rows mais ca pas rapport puisque pas a cause que ya le meme nombre de ligne que c les meme champs...

    merci
    ca ne serait pas plutot !!

    Select nomQuestion,lu from table1

    Select nomQuestion,lu from table2 where login=`bob`

  3. #3
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    à reprendre dans un français intelligible SVP :
    j'ai penser a faire un num rows mais ca pas rapport puisque pas a cause que ya le meme nombre de ligne que c les meme champs...

  4. #4
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    j'ai penser a faire un num rows mais ca pas rapport puisque pas a cause que ya le meme nombre de ligne que c les meme champs...

    C'est vrai que c'est du 5 étoiles là
    Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

    Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)

  5. #5
    Membre du Club Avatar de JFKen
    Profil pro
    Inscrit en
    Février 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 81
    Points : 46
    Points
    46
    Par défaut
    Mais c'est parfaitement clair, à cause que y'a les même PK, puisque pas à cause que c'est les même champs !

    On dirait des traductions Babelfisf / Google

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    j'avoue que c'est laid en sal comme phrase (j'étais fatigué là )

    Je voulais dire mettons que je fais une requête de ma première table et que ça me rapporte

    question 1
    question 2
    question 3

    ensuite ma deuxième requête me rapporte exactement
    question 1
    question 2
    question 3

    J'avais pensé à faire un num_rows pour voir si les 2 ont le même nombre de lignes,mais ça marchera pas dutout puisque que ca ne signifie pas que c'est les mêmes données.

    C'est sur que je pourrais verifier chaque ligne une par une pour vérifier mais j'aimerais savoir si il ya une façon plus rapide.

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Pas de solution miracle, faut faire une boucle pour comparer chaque ligne.

    Ou, mieux à mon avis, remplir 2 tableaux
    $tab1 = array($question1, $question2....)
    $tab2 = array($question1, question2 ....)

    puis un array_diff
    si le résultat est empty, c'est que c'est pareil

    www.php.net/array_diff
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (empty(array_diff($tab1, $tab2)))
    {
        echo 'c\'est pareil';
    }
    else
    {
        echo 'pas pareil';
    }
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    ou alors si ta version de mysql est recente, tu fait un UNION avec un DISTINCT global sur les 2 resultats

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    SELECT nomQuestion from table1 UNION SELECT nomQuestion from table2 where login='un nom';

    Ou je metterais le Distinct global? merci

  10. #10
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    comment sais-tu qu'il tourne avec mysql?
    sinon si ton SGBD supporte UNION et EXCEPT tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (Select nomQuestion from table1 EXCEPT
    Select nomQuestion from table2 where login=`bob`) UNION (Select nomQuestion from table2 where login=`bob`EXCEPT Select nomQuestion from table1)
    si ça te renvoie 0 enregistrement, c'est que le résultat des 2 requêtes est identique

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    Ma version de mySQL supporte pas le EXCEPT , ca me donne une syntax error à chaque fois que je le met.

    Dommage , c'était exactement le genre de requête que je voulais(retourne 0 enregistrements si pareil)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    SELECT nomQuestion from table1 where nom in(SELECT nomQuestion from table2 where login='bob')

    Sinon est-ce que c'est possible de faire ce genre de requete mais au lieu de
    'in' ca serait un 'in negatif'
    Je sais pas si c'est clair

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    oublier le post j'ai juste a mettre 'not'

  14. #14
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par darkbob
    SELECT nomQuestion from table1 UNION SELECT nomQuestion from table2 where login='un nom';

    Ou je metterais le Distinct global? merci
    je pensais a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT nomQuestion FROM (
    SELECT nomQuestion FROM t1
    UNION
    SELECT nomQuestion FROM t2
    );
    evidemment ca ne marche que si les sous requetes fonctionnent aussi... et ca renvoie pas si il y a des doublons ou non, mais une unique liste. Pour detecter les doublons, dans le meme etat d'esprit, on pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT nomQuestion, count(*) as nb FROM (
    SELECT nomQuestion FROM t1
    UNION
    SELECT nomQuestion FROM t2
    )
    group by nomQuestion;
    Voir meme, pour ne retourner que les items qui n'ont pas de doublons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT nomQuestion FROM (
    SELECT nomQuestion FROM t1
    UNION
    SELECT nomQuestion FROM t2
    )
    group by nomQuestion
    having count(*) = 1;

  15. #15
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Salut,

    @Fladnag : UNION supprime les doublons. Donc, dans ton premier code, le DISTINCT et la sous-reqête dans le FROM sont inutiles. Et pour les deux autres, je pense que ça ne fonctionne pas puisque COUNT(*) pour chaque groupe sera 1.

    En plus, je crois que le problème de darkbob n'est pas d'éliminer les doublons mais de savoir si deux requêtes retournent le même résultat. Mais tout ceci m'a donné une idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT AVG(t2.nb)
    FROM (	SELECT COUNT(*) AS Nb
    	FROM (	SELECT nomQuestion FROM table1
    		UNION ALL
    		SELECT nomQuestion FROM table2 where login='bob'
    	     ) t
    	GROUP BY nomQuestion
         ) t2;
    Si la requête renvoie 2 c'est que les deux requêtes renvoient exactement les mêmes résultats.

    Tu peux mettre "SELECT AVG(t2.nb) = 2" comme ça, ça renvoie directement true/false. Et si tu utilises MySQL 5, pourquoi ne pas créer une fonction qui prend en paramètre le login et qui renvoie un booléen.

  16. #16
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    arf, j'oubliais cette propriété de l'union, mais avec UNION ALL en effet, on peut la contourner, et faire les count() qui vont bien ;o)

Discussions similaires

  1. Vérifier si deux numéros sont identiques
    Par challe dans le forum SAS Base
    Réponses: 1
    Dernier message: 25/06/2010, 22h01
  2. [SQL] Vérifier si une requête ne contient pas d'erreurs
    Par Sytchev3 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/10/2007, 16h36
  3. [SQL] Comment faire ma requête
    Par kaiserazo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/05/2005, 10h39
  4. Récupérer le code SQL à partir d'une requête
    Par Edith_T dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 23/11/2004, 14h10
  5. SQL Server 7.0 - Requête Select
    Par sangokus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/03/2004, 10h32

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