[RESOLU] récupérer nombre de champs identiques présents dans deux tables

Eléphant du PHP | 345 Messages

01 nov. 2023, 19:20

Bonjour,
là je coince vraiment.
J'ai deux tables:
jeu avec n1,n2,n3,n4,n5
tirage avec t1,t2,t3,t4,t5

Je veux récupérer le nombre de champs identiques dans les deux tables.

par exemple:
n1= 2
n2= 8
n3= 20
n4= 25
n5= 30
---------------
t1= 8
t2= 20
t3= 30
t4= 31
t5= 40

-------> il faudrait que je récupère cette valeur 3 (8 , 20 et 30)

Si quelqu'un a une piste? jointure, array?
j'ai tenté un test avec un array qui ne me retourne rien
$sql= "SELECT n1,n2,n3,n4,n5 FROM JEUX";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$resultat= $pdostat->fetch();    
$n1= $resultat['n1'];
$n2= $resultat['n2'];
$n3= $resultat['n3'];
$n4= $resultat['n4'];
$n5= $resultat['n5'];
$jeu= array($n1,$n2,$n3,$n4,$n5);

$sql= "SELECT t1,t2,t3,t4,t5 FROM TIRAGE";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$resultat= $pdostat->fetch();    
$t1= $resultat['t1'];
$t2= $resultat['t2'];
$t3= $resultat['t3'];
$t4= $resultat['t4'];
$t5= $resultat['t5'];
$tirage= array($t1,$t2,$t3,$t4,$t5);


print_r(array_intersect($jeu, $tirage));

.

Petit nouveau ! | 9 Messages

02 nov. 2023, 06:23

Salut !

Ce sont tes arrays $tirage et $jeu qui ne retournent rien ?
Tes tables sont bien `jeux` et `tirage` comme dans ton code ou `jeu` comme dans ton post?
Si non, PDO t'affiche des erreurs ? Tu peux var_dump les $resultat ?

Si mes souvenirs sont bons il y a une méthode sinon qui permet d'intersecter directement les tables.
Pour PostgreSQL, SQLite, Oracle bref tout sauf MySQL :
SELECT * FROM jeux INTERSECT SELECT * FROM tirage
Qui retourne en array les résultats identiques des deux tables.

Sous MySQL c'est :
SELECT DISTINCT n1,n2... FROM jeux WHERE n1,n2... IN (SELECT t1,t2... FROM tirage);

Eléphant du PHP | 345 Messages

03 nov. 2023, 02:09

J'avais testé le SELECT DISTINCT il ne marche déjà pas dans MYSQL.... et je souhaite un code en php

Avatar du membre
Mammouth du PHP | 1564 Messages

03 nov. 2023, 09:47

Salut, twnguy ta donné la solution :

Code : Tout sélectionner

SELECT DISTINCT n1,n2... FROM jeux WHERE n1,n2... IN (SELECT t1,t2... FROM tirage);
https://sql.sh/cours/where/in

Eléphant du PHP | 345 Messages

03 nov. 2023, 15:01

Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'n2,n3,n4,n5 IN (t1,t2,t3,t4,t5 FROM TIRAGE)


Avatar du membre
Mammouth du PHP | 1564 Messages

03 nov. 2023, 16:03

Sans ta requête initiale, on pourra pas t'aider.

Eléphant du PHP | 345 Messages

03 nov. 2023, 18:45

$tirage = array($num1,$num2,$num3,$num4,$num5);
sort($tirage);
list($num1,$num2,$num3,$num4,$num5) = $tirage;
$sql="UPDATE TIRAGE SET t1='$num1',t2='$num2',t3='$num3',t4='$num4',t5='$num5'";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();

$sql= "SELECT DISTINCT n1,n2,n3,n4,n5 FROM JEUX WHERE n1,n2,n3,n4,n5 IN (t1,t2,t3,t4,t5 FROM TIRAGE)";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();


Avatar du membre
Mammouth du PHP | 1564 Messages

03 nov. 2023, 18:49

Ta oublié SELECT dans IN().

Eléphant du PHP | 345 Messages

04 nov. 2023, 02:43

$sql= "SELECT DISTINCT n1,n2,n3,n4,n5 FROM JEUX WHERE n1,n2,n3,n4,n5 IN (SELECT t1,t2,t3,t4,t5 FROM TIRAGE)";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'n2,n3,n4,n5 IN (SELECT t1,t2,t3,t4,t5 FROM TIRAGE)' at line 1 in 
cela me met aussi une erreur de syntaxe dans la console MYSQL

Avatar du membre
Mammouth du PHP | 1564 Messages

04 nov. 2023, 08:51

Entoure de parenthèses tes "WHERE" :
SELECT DISTINCT n1, n2, n3, n4, n5
FROM JEUX
WHERE (n1, n2, n3, n4, n5) IN (SELECT t1, t2, t3, t4, t5 FROM TIRAGE);
WHERE s'utilise avec des AND ou OR, pas des virgules.

Eléphant du PHP | 345 Messages

04 nov. 2023, 17:45

Je pense que cela fonctionne car je n'ai plus de message d'erreur.
Par contre dernier point , comment je fais pour récupérer le nombre de champs identiques si il y en a?

Avatar du membre
Mammouth du PHP | 1564 Messages

04 nov. 2023, 17:51

Voir du côté de COUNT, à utiliser dans ta requête SQL.

Eléphant du PHP | 345 Messages

04 nov. 2023, 18:41

:? Alors, çela se complique.
J'ai tenté ceci:
$sql= 'SELECT COUNT (DISTINCT n1,n2,n3,n4,n5) FROM JEUX AS "t1", "t2", "t3", "t4", "t5"  FROM TIRAGE';
Mis ce n'est pas correct.
Faut-il ajouter des crochets dans la requète?
(et un petit UNION ALL au passage?)

Avatar du membre
Mammouth du PHP | 1564 Messages

04 nov. 2023, 18:49

Essaye cette sous requête :
SELECT COUNT(*) AS nombre_colonnes_identiques, t.*
FROM (
    SELECT n1, n2, n3, n4, n5
    FROM JEUX
    WHERE (n1, n2, n3, n4, n5) IN (SELECT t1, t2, t3, t4, t5 FROM TIRAGE)
) AS t;
Dans cette requête, j'utilise une sous-requête pour obtenir le compte (COUNT()) des combinaisons de colonnes identiques, puis je la joins avec ma requête initiale en utilisant t. pour sélectionner toutes les colonnes de la table JEUX correspondant aux combinaisons identiques.

Eléphant du PHP | 345 Messages

05 nov. 2023, 11:04

La requete fonctionne dans MYSQL mais renvoie:

nombre_colonnes_identiques n1 n2 n3 n4 n5
0 NULL NULL NULL NULL NULL