Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 15/11/2010, 20h26   #1
Membre à l'essai
 
Inscription : février 2006
Messages : 259
Détails du profil
Informations personnelles :
Âge : 20

Informations forums :
Inscription : février 2006
Messages : 259
Points : 23
Points : 23
Envoyer un message via MSN à corgato
Par défaut Requêtes temporelles

Bonsoir tout le monde !

J'ai quelque problème pour finir deux de mes pages au niveau des requêtes mysql...

Voilà la structure de ma table qui contient toutes les actions du membre :
Code :
1
2
3
4
5
6
7
 
CREATE TABLE `last_action` (
  `id_membre` int(11) NOT NULL,
  `ip` varchar(16) NOT NULL,
  `date` date NOT NULL,
  `heure` time NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Pour la première requête je voudrais afficher la listes des connexions des membres par ordre décroissant donc de la plus anciennes a la plus récente.

Comme ça il m'est facile de voir qui n'est pas venu depuis X jours...

J'ai fait cette requête mais elle n'est pas correcte vu qu'elle ne me prend pas la dernière date de connexion du membre mais la première...
Code :
1
2
3
4
5
6
7
8
9
10
 
<?php
$req = $bdd->query('SELECT last_action.id_membre, last_action.ip, last_action.date, last_action.heure, membres.pseudo 
			FROM last_action 
			LEFT JOIN membres 
			ON membres.id = last_action.id_membre 
			GROUP BY last_action.id_membre 
			ORDER BY last_action.date DESC, last_action.heure DESC 
			LIMIT '.$limit_start.', '.$pagination
			);

Et la deuxième requête devrait faire en sorte de m'afficher tout les membres qui ne se sont pas connecté depuis plus de 25 jours !

J'ai donc fait ça mais pareil ça ne marche pas comme je le voudrais...
Code :
1
2
3
4
5
6
7
 
<?php
$req = $bdd->query('SELECT id_membre, ip, date, heure 
			FROM last_action 
			WHERE date > CURDATE() - INTERVAL 25 DAY 
			GROUP BY id_membre
                     ');
J'ai essayé max() mais ça ne marche pas correctement, vu que je peux pas faire plusieurs max() dans une requête...

Merci et bonne soirée !
corgato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 18h43   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 550
Points : 9 550
Ta table est mal construite, il faudrait une seule colonne DATETIME et non une colonne DATE et une colonne TIME. Pour la suite, je suppose que c'est fait dans une colonne nommée dateheure.

Pour ta première requête, il faut que tu utilises un MAX(dateheure) dans le SELECT et le ORDER BY, à la place de last_action.date et last_action.heure, et que tu laisses tomber last_action.ip (si un membre peut avoir plusieurs IP).

Pour la seconde, c'est il faut utiliser < et non >.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 18h47   #3
Membre à l'essai
 
Inscription : février 2006
Messages : 259
Détails du profil
Informations personnelles :
Âge : 20

Informations forums :
Inscription : février 2006
Messages : 259
Points : 23
Points : 23
Envoyer un message via MSN à corgato
C'est plus compliqué après pour gèrer seulement les dates non ?

La je peux gérer correctement les dates et mettre aussi les heure si j'en ai besoin, mais généralement j'utilise que la date, et ne prend pas en compte l'heure.

Genre je travail beaucoup avec les dates du style :
Code :
1
2
 
WHERE date != CURDATE() - INTERVAL 23 DAY
Donc si j'utilise directement un datetime(), c'est plus compliqué non ?
corgato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 22h32   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 550
Points : 9 550
Si tu veux chercher des trucs du genre "le plus récent", avoir deux colonnes te force à faire une formule du genre

Code :
MAX(date_add( `date`, INTERVAL heure HOUR_SECOND ))
Au passage, c'est un peu casse-gueule d'utiliser un mot réservé comme DATE pour nommer une colonne.

A l'inverse, pour les recherches sur une date précise, il suffit d'arrondir avec la fonction DATE() :

Code :
WHERE DATE(dateheure) != CURDATE() - INTERVAL 23 DAY
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 22h41   #5
Membre à l'essai
 
Inscription : février 2006
Messages : 259
Détails du profil
Informations personnelles :
Âge : 20

Informations forums :
Inscription : février 2006
Messages : 259
Points : 23
Points : 23
Envoyer un message via MSN à corgato
je savais pas qu'en fessant DATE(dateheure) sa arrondi.

je peux utiliser date, je lu dans la doc que ça ne pose pas de problème.

Merci je vais tester.

EDIT : j'arrive pas a savoir ce que "DATE(dateheure)" me retourne. Il arrondi comment a quoi ?
corgato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 22h53   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 550
Points : 9 550
DATE te donne la date sans l'heure...

Code :
SELECT now() AS dateheure, date(now()) AS dateseule
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 19h44   #7
Membre à l'essai
 
Inscription : février 2006
Messages : 259
Détails du profil
Informations personnelles :
Âge : 20

Informations forums :
Inscription : février 2006
Messages : 259
Points : 23
Points : 23
Envoyer un message via MSN à corgato
Merci c'est parfait !

Merci beaucoup !
corgato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 22h44   #8
Membre à l'essai
 
Inscription : février 2006
Messages : 259
Détails du profil
Informations personnelles :
Âge : 20

Informations forums :
Inscription : février 2006
Messages : 259
Points : 23
Points : 23
Envoyer un message via MSN à corgato
j'ai encore un dernière problème avec la requête pour afficher tout les membres non connecté depuis 23 jours...

Code :
1
2
3
4
5
6
7
8
 
<?php
$req = $bdd->query('SELECT membres.pseudo, last_action.id_membre, last_action.ip, MAX(last_action.dateheure) AS dateheure 
					FROM last_action 
					LEFT JOIN membres
					ON membres.id = last_action.id_membre 
					WHERE DATE(last_action.dateheure) < CURDATE() - INTERVAL 23 DAY 
					GROUP BY membres.id');
Il me retourne pas le datetime max mais le premier du coup c'est faussé...
J'aimerais bien qu'il récupéré que le dernière et non le premier enregistrement dans la table.

Merci !
corgato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 22h48   #9
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
j'aurai plutot vu un truc du genre, sans être sur de la syntaxe:
Code :
1
2
3
4
5
SELECT membres.pseudo,
MAX(last_action.dateheure) AS dateheure 
FROM last_action  LEFT JOIN membres ON membres.id = last_action.id_membre 
GROUP BY membres.id
HAVING DATE(last_action.dateheure) < ( CURDATE() - INTERVAL 23 DAY )
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 02h09   #10
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 550
Points : 9 550
oui, c'est bien un HAVING et non un WHERE.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 17h26.


 
 
 
 
Partenaires

Hébergement Web