Comment le nombre total des numéros identiques apparus deux fois de suite

Fermé
zack77 Messages postés 25 Date d'inscription dimanche 21 septembre 2014 Statut Membre Dernière intervention 6 décembre 2020 - Modifié le 23 janv. 2019 à 10:01
jordane45 Messages postés 38347 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 décembre 2024 - 23 janv. 2019 à 23:06
Bonjour, j'ai une table sql nommée tablenumber

CREATE TABLE IF NOT EXISTS `tablenumber` (
  `num` mediumint(10) NOT NULL AUTO_INCREMENT,
  `field1` int(11) NOT NULL,
  `field2` int(11) NOT NULL,
  `field3` int(11) NOT NULL,
  `field4` int(11) NOT NULL,
  `field5` int(11) NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`num`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=101 ;

 Contenu de la table `tablenumber`

INSERT INTO `tablenumber` (`num`, `field1`, `field2`, `field3`, `field4`, `field5`, `date`) VALUES
(1, 11, 19, 26, 35, 40, '2009-06-05'),
(2, 6, 14, 16, 34, 50, '2009-06-12'),
(3, 4, 16, 17, 20, 29, '2009-06-19'),
(4, 6, 11, 21, 30, 39, '2009-06-26'),
(5, 21, 29, 34, 46, 47, '2009-07-03'),
(6, 6, 16, 20, 42, 46, '2009-07-10'),
(7, 2, 8, 17, 32, 50, '2009-07-17'),
(8, 14, 15, 25, 35, 47, '2009-07-24'),
(9, 5, 9, 20, 21, 26, '2009-07-31'),
(10, 10, 20, 22, 24, 31, '2009-08-07'),
(11, 5, 8, 24, 30, 49, '2009-08-14'),
(12, 4, 7, 16, 31, 42, '2009-08-21'),
(13, 8, 36, 37, 41, 49, '2009-08-28'),
(14, 29, 30, 36, 37, 48, '2009-01-02'),
(15, 7, 15, 22, 28, 48, '2009-01-09'),
(16, 3, 17, 22, 49, 50, '2009-01-16'),
(17, 32, 33, 36, 40, 49, '2009-01-23'),
(18, 4, 29, 34, 35, 46, '2009-01-30'),
(19, 10, 20, 30, 36, 40, '2009-02-06'),
(20, 22, 33, 36, 40, 42, '2009-02-13'),
(21, 9, 12, 13, 14, 48, '2009-02-20'),
(22, 5, 9, 37, 44, 45, '2009-02-27'),
(23, 13, 17, 19, 25, 35, '2009-03-06'),
(24, 12, 24, 26, 36, 42, '2009-03-13'),
(25, 12, 16, 23, 31, 35, '2009-03-20'),
(26, 25, 33, 36, 38, 42, '2009-03-27'),
(27, 2, 20, 24, 32, 46, '2009-04-03'),
(28, 9, 14, 16, 37, 46, '2009-04-10'),
(29, 4, 7, 21, 44, 47, '2009-04-17'),
(30, 4, 14, 21, 24, 41, '2009-04-24'),
(31, 5, 19, 31, 38, 47, '2009-05-01'),
(32, 4, 23, 24, 29, 31, '2009-05-08'),
(33, 8, 18, 19, 20, 42, '2009-05-15'),
(34, 4, 13, 14, 33, 43, '2009-05-22'),
(35, 2, 5, 30, 37, 47, '2009-05-29'),
(36, 6, 9, 20, 38, 39, '2009-09-04'),
(37, 12, 15, 35, 42, 43, '2009-09-11'),
(38, 22, 23, 24, 29, 44, '2009-10-02'),
(39, 7, 11, 29, 46, 50, '2009-10-09'),
(40, 12, 23, 30, 31, 47, '2009-10-16'),
(41, 9, 33, 35, 38, 40, '2009-10-30'),
(42, 6, 17, 18, 21, 34, '2009-09-25'),
(43, 6, 16, 30, 38, 41, '2009-09-18'),
(44, 6, 18, 20, 29, 31, '2009-10-23'),
(45, 5, 9, 28, 43, 47, '2009-11-20'),
(46, 11, 19, 34, 43, 45, '2009-11-06'),
(47, 13, 15, 25, 26, 32, '2009-11-13'),
(48, 5, 8, 13, 15, 33, '2009-11-27'),
(49, 18, 19, 25, 30, 44, '2009-12-04'),
(50, 20, 41, 43, 44, 46, '2009-12-11'),
(51, 14, 30, 32, 35, 49, '2009-12-18'),
(52, 4, 5, 14, 17, 34, '2009-12-25'),
(53, 1, 5, 18, 38, 45, '2010-02-12'),
(54, 34, 35, 38, 39, 46, '2010-02-05'),
(55, 9, 17, 30, 39, 43, '2010-01-29'),
(56, 4, 22, 27, 36, 44, '2010-01-22'),
(57, 11, 26, 29, 49, 50, '2010-01-15'),
(58, 4, 5, 14, 44, 46, '2010-01-08'),
(59, 9, 22, 24, 27, 36, '2010-01-01'),
(60, 10, 28, 30, 38, 39, '2010-03-19'),
(61, 8, 16, 18, 37, 43, '2010-03-26'),
(62, 12, 18, 24, 26, 45, '2010-04-02'),
(63, 1, 26, 33, 36, 46, '2010-03-12'),
(64, 12, 18, 19, 43, 49, '2010-03-05'),
(65, 7, 11, 18, 29, 42, '2010-02-26'),
(66, 12, 31, 37, 38, 43, '2010-02-19'),
(67, 38, 39, 45, 46, 49, '2010-07-16'),
(68, 9, 13, 15, 19, 24, '2015-01-30'),
(69, 17, 31, 33, 44, 50, '2015-02-03'),
(70, 10, 26, 30, 39, 50, '2015-02-06'),
(71, 13, 17, 20, 30, 45, '2015-02-10'),
(72, 12, 24, 39, 42, 44, '2015-02-13'),
(73, 2, 5, 18, 30, 43, '2015-02-17'),
(74, 4, 10, 14, 37, 46, '2015-02-20'),
(75, 5, 14, 17, 25, 47, '2015-02-27'),
(76, 3, 25, 28, 34, 50, '2015-02-24'),
(77, 6, 8, 11, 13, 21, '2015-03-03'),
(78, 22, 24, 25, 28, 49, '2015-01-02'),
(79, 14, 20, 30, 38, 49, '2015-01-06'),
(80, 6, 21, 24, 32, 45, '2015-01-09'),
(81, 8, 17, 21, 31, 34, '2015-01-13'),
(82, 29, 30, 32, 34, 46, '2015-01-16'),
(83, 15, 33, 41, 44, 47, '2015-01-20'),
(84, 6, 29, 30, 38, 45, '2015-01-23'),
(85, 5, 10, 31, 33, 40, '2015-01-27'),
(86, 16, 29, 32, 36, 41, '2004-02-13'),
(87, 7, 13, 39, 47, 50, '2004-02-20'),
(88, 14, 18, 19, 31, 37, '2004-02-27'),
(89, 4, 7, 33, 37, 39, '2004-03-05'),
(90, 15, 24, 28, 44, 47, '2004-03-12'),
(91, 33, 36, 37, 42, 45, '2004-03-19'),
(92, 3, 4, 10, 23, 43, '2004-03-26'),
(93, 4, 12, 24, 27, 36, '2004-04-02'),
(94, 1, 4, 10, 19, 23, '2004-04-09'),
(95, 14, 15, 28, 35, 40, '2004-04-16'),
(96, 6, 10, 21, 45, 49, '2004-04-23'),
(97, 5, 6, 16, 23, 27, '2004-04-30'),
(98, 15, 16, 21, 36, 38, '2004-05-07'),
(99, 1, 3, 21, 32, 39, '2004-05-14'),
(100, 15, 29, 37, 39, 49, '2004-05-21');



Ma question est:

comment afficher le nombre total de chaque numéro apparu deux fois consécutivement. J'ai créé un script php qui faut trop de calcul. Les numéros sont de 1 à 50 et ranger par date en ordre croissant

Mon script est
<center><table border="1" cellpadding="1" cellspacing="1" style="width:500px"><tbody>

<tr>
<td><span style="color:#FF0000"><strong>N°</td>
<td><span style="color:#FF0000"><strong> Numéros </td>
</tr><?php 

$i=1;$nbr=0;

while ($i<51)
  {
   
$req1=$base->query("SELECT * FROM `tablenumber` WHERE `n1`='$i' or `n2`='$i' or `n3`='$i' or `n4`='$i' or `n5` ='$i' order by date asc");

   while($affiche = $req1->fetch(PDO::FETCH_BOTH))
  {   

  $req=$base->query("SELECT num, n1, n2,n3,n4,n5,date FROM `tablenumber` WHERE `date`>'".$affiche['date']."' ORDER BY date asc limit 0,1");
  $result = $req->fetch(PDO::FETCH_BOTH);

  if($result['n1']==$i or $result['n2']==$i or $result['n3']==$i or $result['n4']==$i  or $result['n5']==$i)
  {
   $nbr++;
   //print_r($result);echo "".$affiche['date']."<br>";
  }
  

  }
  
  ?><tr>
<td> <?php echo" <font color='blue'>$i</font> "?> </td>
<td> <?php echo $nbr ?></td>
<tr><?php

$i++;$nbr=0;
}
?>
</tbody></table>

Ce script m'a affiché :

N° Nombre
1 0 sortie consécutive
2 0 sortie consécutive
3 0 sortie consécutive
4 3 sorties consécutives
5 1 sortie consécutive
6 2 sorties consécutives
7 0
8 0
9 1
10 0
11 0
12 1


ainsi de suite jusqu’à 50 ème numéros, sachant que le statistique ne prend pas en compte les 3 ou 4 numéros sortis consécutivement.

EDIT : Ajout des balises de code

A voir également:

2 réponses

jordane45 Messages postés 38347 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 décembre 2024 4 719
23 janv. 2019 à 10:25
Bonjour,

Déjà, pour coller son code sur le forum, merci d'utiliser les BALISES DE CODE.
Explications disponibles ici. https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

Ensuite, je t'invite à lire ceci :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Et enfin ,
je pense que si tu retravailles un peu l'array contenant les données, cela facilitera ensuite la recherche que tu souhaites mettre en place.

<?php
//--------------------------------------------------------------------------//
//Affichage des erreurs PHP
//--------------------------------------------------------------------------//
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//--------------------------------------------------------------------------//
//Récupération des numéros dans la bdd
//--------------------------------------------------------------------------//
 //préparation de la requête 
  $sql = "SELECT * FROM tablenumber";
  //Execution de la requete
  try{
    $requete = $base-> prepare($sql) ;
    $requete->execute() ;
    $arrNum = $requete->fetchAll(); //on stocke le resultat dans un array
  }catch(Exception $e){
    // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
  }


//--------------------------------------------------------------------------//
// On retravaille la liste des numéros..
//--------------------------------------------------------------------------//
$arr_numeros = array();
$arr_dates = array();
foreach ($arrNum  as $R){
	$date = $R['date'];
	$arr_dates[$date] = $date;
        //on récupère le contenu des champs field1... field5
	for($i = 1; $i<=5;$i++){
		if(!empty($R['field'.$i])){
			$arr_numeros[$R['field'.$i]][]=$date;	
		}
	}
}
ksort($arr_numeros); //on re trie le tableau dans l'ordre...
ksort($arr_dates); //on re trie le tableau dans l'ordre...

//Affichage du tableau
echo "<pre> Numéros <br>";
print_r($arr_numeros);
echo "</pre>";

echo "<pre> Dates des tirages<br>";
print_r($arr_dates);
echo "</pre>";

?>

Donc maintenant tu as deux array
Un contenant la liste des numéros et à quelles dates il sont sorti
et un array contenant la liste des dates.
Cela devrait être assez simplet de boucler sur le premier et de vérifier avec le second si les dates se suivent ou non..
0
zack77 Messages postés 25 Date d'inscription dimanche 21 septembre 2014 Statut Membre Dernière intervention 6 décembre 2020
23 janv. 2019 à 22:43
Bonjour jordane45, Merci pour votre réponse

J'ai eu le message d'erreur suivant :
Warning: Illegal string offset 'date' in C:\wamp\www\pdo_url_rewrite\seeupdatedelete\new5.php on line 79


Moi je souhaite afficher le nombre total des numéros qui sont enregistrés deux fois de suite par date.

Par exemple si le numéro 1 est présent dans les enregistrement 01 et le 02 puis le 7 et le 8 puis le 20 et le 21
Je souhaite que mon script affiche que le 1 est enregistré 3 deux fois de suite.
0
jordane45 Messages postés 38347 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 décembre 2024 4 719
23 janv. 2019 à 23:06
J'ai testé le script avec les données que tu avais communiqué de ta BDD...
Si tu as eu un message d'erreur.. c'est que tu as modifié quelquechose dans ta bdd ou que tu as mal copié le code que je t'ai donné.

J'ai bien compris que ton code donne le resultat obtenu.. mais qu'il est trop lent... et que tu veux l'améliorer.
Je t'ai donc donné une base de travail.... mais ne t'attends pas à ce que je fasse le boulot à ta place.
0
zack77 Messages postés 25 Date d'inscription dimanche 21 septembre 2014 Statut Membre Dernière intervention 6 décembre 2020
23 janv. 2019 à 22:51

<?php 
//base de données

$base = new PDO('mysql:dbname=stat_numero;host=localhost;charset=utf8', 'root', '');
$base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$base->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
?>





<center><table border="1" cellpadding="1" cellspacing="1" style="width:500px"><tbody>

<tr>
<td><span style="color:#FF0000"><strong>N°</td>
<td><span style="color:#FF0000"><strong> Numéros </td>
</tr><?php	

$i=1;$nbr=0;

while ($i<51)
		{
			
$req1=$base->query("SELECT * FROM `tablenumber` WHERE `n1`='$i' or `n2`='$i' or `n3`='$i' or `n4`='$i' or `n5` ='$i' order by date asc");

		 while($affiche = $req1->fetch(PDO::FETCH_BOTH))
		{			

		$req=$base->query("SELECT num, n1, n2,n3,n4,n5,date FROM `tablenumber` WHERE `date`>'".$affiche['date']."' ORDER BY date asc limit 0,1");
		$result = $req->fetch(PDO::FETCH_BOTH);

		if($result['n1']==$i or $result['n2']==$i or $result['n3']==$i or $result['n4']==$i  or $result['n5']==$i)
		{
			$nbr++;
			//print_r($result);echo "".$affiche['date']."<br>";
		}
		

		}
		
		?><tr>
<td> <?php echo" <font color='blue'>$i</font> "?> </td>
<td> <?php echo $nbr ?></td>
<tr><?php

$i++;$nbr=0;
}
?>
</tbody></table>



mon script affiche le résultat souhaite, mais il fait trop de calcul inutile, je souhaite le simplifier merci.
0