Problème pour récupérer des enregistrements de ma base de do

Petit nouveau ! | 8 Messages

23 mai 2014, 10:45

Bonjour,

J'ai une table passage qui enregistre les passages d'une déchetterie.
Pour chaque utilisateur, je souhait rechercher tous les passages mais j'aimerais récupérer les passages uniquement si pour le même jour j'ai un enregistrement qui a un intervalle <= à 15min
et ça sur une année entière.

J'ai essayé de faire un bout de code mais rien de probant !
En fait je ne sais pas comment tester intervalle de 15 min pour le même jour et pour le même utilisateur
<?php
try
{
	$cnx = new PDO('mysql:host=localhost;dbname=smtom', 'root', '');
}catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
}

$h = $cnx->query("SELECT * FROM habitants ORDER BY lastname") or die("ERROR H");
	while ($row = $h->fetch(PDO::FETCH_ASSOC))
	{
		$p = $cnx->query("SELECT * FROM dechetterie_passages WHERE habitant = '".$row['id']."'") or die("ERROR P");
		while ($passage = $p->fetch(PDO::FETCH_ASSOC))
		{
			echo "Habitant : ".$row["lastname"]." ".$row["firstname"]." Passage : ".$passage["datetime"]."<br><br>";
		}
		
	}
?>

ViPHP
ViPHP | 2577 Messages

23 mai 2014, 11:02

Le principe est de faire une jointure de la table des passages sur elle même :
select a.* from passage as a, passage as b
Puis de selectionner les couples de passage par habitant :
select a.* from passage as a, passage as b where a.habitant = b.habitant
Puis d'ordonné les passages en mettant toujours le plus récent d'abord (avant chaque coupe est présent 2 fois).
select a.* from passage as a, passage as b where a.habitant = b.habitant and a.datepassage > b.datepage
Enfin de sélectionner les écarts de moins de 15 mn
select a.* from passage as a, passage as b where a.habitant = b.habitant and a.datepassage > b.datepassage and datediff(a.datepassage,b.datepassage) < 15mn
Je te laisses chercher la fonction mysql pour la différence de date et adapter avec tes nom de colonnes et de table.

Petit nouveau ! | 8 Messages

23 mai 2014, 12:06

Merci pour ton aide.

Lorsque je fais ta requête, je n'obtiens pas ce que j'aimerais.
j'aimerais avoir pour un habitant les passages où la date et l'heure entre deux passages sont de moins de 15 min

Hors là j'ai tous les passages ne sont pas trié par habitant
voici le code
<?php
try
{
	$cnx = new PDO('mysql:host=localhost;dbname=smtom', 'root', '');
}catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
}
$h = $cnx->query("SELECT a.* FROM `dechetterie_passages` AS a, `dechetterie_passages` AS b WHERE a.`habitant` = b.`habitant` AND a.`datetime` > b.`datetime` AND DATEDIFF(a.`datetime`, b.`datetime`)< 900 ORDER BY habitant");
while($row = $h->fetch(PDO::FETCH_ASSOC))
{
	echo "Habitant : ".$row["id"]." Passage : ".$row["datetime"]."<br><br>";
}

?>
Voici le résultat obtenue
Habitant : 1995 Passage : 2014-04-05 09:16:57

Habitant : 1325 Passage : 2014-03-15 11:01:06

Habitant : 1995 Passage : 2014-04-05 09:16:57

Habitant : 1325 Passage : 2014-03-15 11:01:06

Habitant : 1995 Passage : 2014-04-05 09:16:57

Habitant : 500 Passage : 2014-02-06 09:01:53

Habitant : 2158 Passage : 2014-04-10 16:00:02
Résultat souhaité :
Habitant : 1995 Passage : 2014-04-05 09:16:57

Habitant : 1995 Passage : 2014-04-05 09:16:57

Habitant : 1995 Passage : 2014-04-05 09:16:57

Habitant : 1325 Passage : 2014-03-15 11:01:06

Habitant : 1325 Passage : 2014-03-15 11:01:06

Habitant : 500 Passage : 2014-02-06 09:01:53

Habitant : 2158 Passage : 2014-04-10 16:00:02

Petit nouveau ! | 8 Messages

23 mai 2014, 12:36

Bon j'ai trouvé mais il m'affiche des habitants pour lesquels il n'y a qu'un seul passage, comment les supprimer?

ViPHP
ViPHP | 2577 Messages

23 mai 2014, 14:38

Essayes "SELECT a.habitant,b.habitant , a.`datetime` b.`datetime`, DATEDIFF(a.`datetime`, b.`datetime`) FROM...
Ca te permettra de voir les 2 passages pris en compte. En particulier, tu pourras vérifier visuellement a.habitant,b.habitant et l'écart de 15 mn.

Possible que DATEDIFF(a.`datetime`, b.`datetime`) soit dans le mauvais sens : DATEDIFF(b.`datetime`, a.`datetime`) ?