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

Avatar du membre
Mammouth du PHP | 1564 Messages

05 nov. 2023, 12:33

Où se situe le problème ?

Eléphant du PHP | 345 Messages

05 nov. 2023, 15:39

Ben, en "trichant" dans la table, j'ai mis deux résultats identiques, donc ca devrait afficher 2, non?

J'ai testé la requete en php, et j'obtiens toujours 0 quelque soit le nombre de colonnes identiques.

Avatar du membre
Mammouth du PHP | 1564 Messages

06 nov. 2023, 09:08

En effet, pour que ce soit identique, il faut que toutes les colonnes le soient.

Tu peux faire une première requête, puis compter via une variable PHP les colonnes identiques.

Eléphant du PHP | 345 Messages

06 nov. 2023, 15:06

Je ne vois pas comment faire. :oops:
Et la requète initiale affiche TOUJOURS 0 quelque soit le nombre de champs identiques (1 , 2 , 3 ,4 ou 5)
$sql="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";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$row = $pdostat->fetch();
$resu = $row['nombre_colonnes_identiques']; 
echo $resu; 

Avatar du membre
Mammouth du PHP | 1564 Messages

06 nov. 2023, 15:17

de quel type sont tes colonnes n1, n2.. ? et les t1, t2... ?

Eléphant du PHP | 345 Messages

06 nov. 2023, 17:04

TABLE JEUX ( pour les n)

Image


TABLE TIRAGE ( pour les t)

Image

Avatar du membre
Mammouth du PHP | 1564 Messages

06 nov. 2023, 18:02

Ils sont identiques, pas de souci.

Une autre solution serait de chercher chaque colonne :
SELECT COUNT(*) AS nombre_colonnes_identiques FROM JEUX
 WHERE 
  n1 IN (SELECT t1, t2, t3, t4, t5 FROM TIRAGE)  
OR 
  n2 IN (SELECT t1, t2, t3, t4, t5 FROM TIRAGE)  
OR 
  n3 IN (SELECT t1, t2, t3, t4, t5 FROM TIRAGE)  
OR 
  n4 IN (SELECT t1, t2, t3, t4, t5 FROM TIRAGE)  
OR 
  n5 IN (SELECT t1, t2, t3, t4, t5 FROM TIRAGE)
Modifié en dernier par two3d le 06 nov. 2023, 18:03, modifié 1 fois.

ynx
Mammouth du PHP | 586 Messages

06 nov. 2023, 18:02

Pas sûr que la solution sql proposée puisse fonctionner car tu veux faire une intersection, l'utilisation de array_intersect semblait être une bonne piste :
<?php

$jeux = [
    ["n1" => 1, "n2" => 2, "n3" => 3, "n4" => 4, "n5" => 5],
    ["n1" => 2, "n2" => 8, "n3" => 20, "n4" => 25, "n5" => 30],
];

$tirages = [["t1" => 8, "t2" => 20, "t3" => 30, "t4" => 31, "t5" => 40]];

foreach ($tirages as $tirage) {
    foreach ($jeux as $jeu) {
        echo "tirage : " . implode(",", $tirage) . "\n";
        echo "jeu : " . implode(",", $jeu) . "\n";

        $intersect = array_intersect($tirage, $jeu);

        echo "count intersect : " . count($intersect) . "\n";

        if (count($intersect) > 0) {
            echo "intersect : " . implode(",", $intersect) . "\n";
        }

        echo "\n";
    }
}
Affiche :
tirage : 8,20,30,31,40
jeu : 1,2,3,4,5
count intersect : 0

tirage : 8,20,30,31,40
jeu : 2,8,20,25,30
count intersect : 3
intersect : 8,20,30

Eléphant du PHP | 345 Messages

07 nov. 2023, 09:58

Bonjour,

La solution de two3d affiche un message d'erreur:

Cardinality violation: 1241 Operand should contain 1 column(s)


Avatar du membre
Mammouth du PHP | 1564 Messages

07 nov. 2023, 10:18

Tu peux le faire avec une jointure sinon :
SELECT COUNT(*) AS nombre_colonnes_identiques
FROM JEUX
INNER JOIN TIRAGE ON 
JEUX.n1 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n2 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n3 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n4 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n5 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5);
Après tout dépends ta recherche, si tu vérifie si n1 est dans toutes les colonnes de TIRAGE ou seulement t1, la requête peut être simplifiée :
SELECT COUNT(*) AS nombre_colonnes_identiques FROM JEUX
WHERE 
  n1 IN (SELECT t1 FROM TIRAGE)
  OR n2 IN (SELECT t2 FROM TIRAGE)
  OR n3 IN (SELECT t3 FROM TIRAGE)
  OR n4 IN (SELECT t4 FROM TIRAGE)
  OR n5 IN (SELECT t5 FROM TIRAGE);

Eléphant du PHP | 345 Messages

07 nov. 2023, 12:29

Il y a un mieux, mais la requete va prendre tous les n s'il y a plusieurs jeux en table JEUX.
J'ai donc ciblé avec le pseudo, mais si le joueur fait plusieurs grilles, le résultat reste incohérent.
J'essaie de rajouter "lastInsertId() mais ça plante.
$sql="SELECT COUNT(*) AS nombre_colonnes_identiques FROM JEUX INNER JOIN TIRAGE ON JEUX.n1 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR JEUX.n2 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5) OR JEUX.n3 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR JEUX.n4 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5) OR JEUX.n5 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5) WHERE name='$pseudo' AND lastInsertId()";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$row = $pdostat->fetch();
$resu = $row['nombre_colonnes_identiques']; 
echo $resu; 
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1370 execute command denied to user 'ub6k8_youe'@'%' for routine 'ub6k8_xxxx.lastInsertId' 

Avatar du membre
Mammouth du PHP | 1564 Messages

07 nov. 2023, 12:33

LAST_INSERT_ID()

Eléphant du PHP | 345 Messages

07 nov. 2023, 17:36

Bien, j'ai finalement viré LAST_INSERT ID() qui ne semblait pas fonctionner.
Ce que j'ai fait, c'est dans la foulée du résultat, et quelqu'il soit, je delete en table le pseudo qui vient de jouer.
Ainsi, aucune incohérence possible sachant aussi que le joueur ne peut faire qu'une grille par une grille.
Un dernier petit soucis, comment limiter le nombre de cases à cocher à 5?
if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
    }
    
$sql="INSERT INTO JEUX (name, city, pays, continent, n1, n2, n3, n4, n5) VALUES ('$pseudo', '$citoyen', '$residant', '$situation_continent', '{$cases_cochees[0]}','{$cases_cochees[1]}','{$cases_cochees[2]}','{$cases_cochees[3]}','{$cases_cochees[4]}');";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();


.

Avatar du membre
Mammouth du PHP | 1564 Messages

07 nov. 2023, 17:58

Tu ajoute un itérateur à ta boucle foreach (avant ton foreach : $n = 0, puis dans le foreach, $n ++, puis tu vérifie si $n <= 5).

Eléphant du PHP | 345 Messages

07 nov. 2023, 22:11

if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
$n=0;
}
    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
	  $n++;
if($n<=5){
$sql="INSERT INTO JEUX (name, city, pays, continent, n1, n2, n3, n4, n5) VALUES ('$pseudo', '$citoyen', '$residant', '$situation_continent', '{$cases_cochees[0]}','{$cases_cochees[1]}','{$cases_cochees[2]}','{$cases_cochees[3]}','{$cases_cochees[4]}');";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
}
}
}
Warning: Undefined array key 1 in /home/clients/78f15c369c0786c4a419608e9e60028........
Warning: Undefined array key 2 in /home/clients/78f15c369c0786c4a419608e9e60028a...............
Warning: Undefined array key 3 in home/clients/78f15c369c0786c4a419608e9e60028a...on line 28
Warning: Undefined array key 4 in home/clients/78f15c369c0786c4a419608e9e60028a on line 28
Warning: Undefined array key 2 in home/clients/78f15c369c0786c4a419608e9e60028on line 28
Warning: Undefined array key 3 in home/clients/78f15c369c0786c4a419608e9e60028..on line 28

etc...