Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2006, 03h41   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2005
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 86
Points : 13
Points : 13
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
darkbob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 07h58   #2
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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`
  Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 08h17   #3
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
à reprendre dans un français intelligible SVP :
Citation:
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...
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 09h28   #4
Expert Confirmé

 
Avatar de Amara
 
Inscription : juillet 2004
Messages : 2 684
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 2 684
Points : 2 910
Points : 2 910
Citation:
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)
Amara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 09h45   #5
Nouveau Membre du Club
 
Avatar de JFKen
 
Inscription : février 2006
Messages : 81
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : février 2006
Messages : 81
Points : 29
Points : 29
Envoyer un message via MSN à JFKen
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
JFKen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 14h33   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2005
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 86
Points : 13
Points : 13
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.
darkbob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 14h47   #7
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
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 :
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

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 16h08   #8
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
ou alors si ta version de mysql est recente, tu fait un UNION avec un DISTINCT global sur les 2 resultats
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 16h17   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2005
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 86
Points : 13
Points : 13
SELECT nomQuestion from table1 UNION SELECT nomQuestion from table2 where login='un nom';

Ou je metterais le Distinct global? merci
darkbob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 16h30   #10
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
comment sais-tu qu'il tourne avec mysql?
sinon si ton SGBD supporte UNION et EXCEPT tu peux faire
Code :
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
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 16h49   #11
Candidat au titre de Membre du Club
 
Inscription : décembre 2005
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 86
Points : 13
Points : 13
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)
darkbob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 17h39   #12
Candidat au titre de Membre du Club
 
Inscription : décembre 2005
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 86
Points : 13
Points : 13
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
darkbob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 17h41   #13
Candidat au titre de Membre du Club
 
Inscription : décembre 2005
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 86
Points : 13
Points : 13
oublier le post j'ai juste a mettre 'not'
darkbob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 19h40   #14
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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 :
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 :
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 :
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;
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 20h30   #15
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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 :
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.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2006, 20h35   #16
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h20.


 
 
 
 
Partenaires

Hébergement Web