IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Comment extraire 1x/24h sur base d'un timestamp


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 54
    Points
    54
    Par défaut Comment extraire 1x/24h sur base d'un timestamp
    Bonjour,

    J'ai réalisé un jeu-concours, où les visiteurs peuvent participer 1x/24h.
    Une fois le concours terminé, on tire au sort le gagnant.

    Le souci c'est que des petits malins ont réussi à jouer plus d'1x/24h.
    Je suis donc à la recherche d'une solution qui me permettrait d'extraire ces «*tricheurs*». Ou tout simplement, faire un :
    SELECT * FROM player WHERE timestamp%24h

    Merci d'avance pour vos avis éclairés !

    NB. le tout est sous libmysql - 5.5.25

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT P1.*
    FROM Player P1
    INNER JOIN Player P2
        ON P2.Id = P1.Id
    WHERE TIMEDIFF(P1.LeTimestamp, P2.LeTimsestamp) BETWEEN '00:00:00' AND '24:00:00'

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 54
    Points
    54
    Par défaut
    Ça doit être quelque chose comme ça, mais je n'arrive pas à obtenir le résultat espéré.

    La table msg contient 22,241 entrées pour 17,024 users.

    Si j'applique la requête telle que donné, adapté à la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT M1.* FROM msg M1	INNER JOIN msg M2 ON M1.user_id = M2.user_id WHERE TIMEDIFF(M1.created, M2.created) BETWEEN '00:00:00' AND '24:00:00'
    je me retrouve avec 93,034 lignes, certains messages étant dupliqué 3, 4x.

    En ajoutant :
    Je retrouve mes 22,241 lignes de départ…

    N'ayant pas l'habitude de joindre une table à elle même, je ne comprends pas bien son comportement.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    En effet, j'ai oublié un petit détail détail dans ma requete, essayez plutot ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT distinct M1.Id 
    FROM msg M1	
    INNER JOIN msg M2 
        ON M1.user_id = M2.user_id 
        AND M1.created <> M2.created
    WHERE TIMEDIFF(M1.created, M2.created) BETWEEN '00:00:00' AND '24:00:00'
    L'auto jointure permet de comparer chaque ligne avec toutes les autres lignes du même joueur, mais j'avais oublié d'exclure la ligne elle-même...

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 084
    Points : 30 841
    Points
    30 841
    Par défaut
    Encore un peu plus efficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT M1.Id 
    FROM msg M1	
    INNER JOIN msg M2 
        ON M1.user_id = M2.user_id 
        AND M1.created > M2.created
    WHERE TIMEDIFF(M1.created, M2.created) < '24:00:00'
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 54
    Points
    54
    Par défaut
    Merci pour votre aide!

    J'ai encore une petite question au sujet du TIMEDIFF(M1.created, M2.created) < '24:00:00'

    Avec la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT M1.id AS ID1, M2.id AS ID2, M2.user_id ,TIMEDIFF(M1.created, M2.created) FROM msg M1 INNER JOIN msg M2 
    ON M1.user_id = M2.user_id 
    AND M1.created > M2.created
    WHERE TIMEDIFF(M1.created, M2.created) < '24:00:00'
    GROUP BY M1.id
    J'ai des diff de plus de 24h :
    ID1 ID2 user_id diff
    31 28 27 [->] 00:56:53
    32 28 27 [->] 00:57:22
    456 1 1 [->] 117:21:58
    457 1 1 [->] 117:21:58
    5708 1 1 [->] 158:25:48

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Ca sent la conversion étrange.

    Vous pouvez tester avec DATE_ADD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT M1.id AS ID1, M2.id AS ID2, M2.user_id ,TIMEDIFF(M1.created, M2.created) FROM msg M1 INNER JOIN msg M2 
    ON M1.user_id = M2.user_id 
    AND M1.created > M2.created
    WHERE DATE_ADD(M1.created, INTERVAL '24' HOURS) < M2.created
    GROUP BY M1.id

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 084
    Points : 30 841
    Points
    30 841
    Par défaut
    Parce qu'il faut comparer des types comparables...
    Ici, il a converti le résultat de TIMEDIFF en chaine avant de faire la comparaison avec '24:00:00'
    Tu obtiendras sans doute un meilleur résultat avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIMEDIFF(M1.created, M2.created) < STR_TO_DATE('24:00:00', '%H:%i:%s')
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Points : 54
    Points
    54
    Par défaut
    En mixant vos différents conseil j'y suis arrivé!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT M1.id AS ID1, M2.id AS ID2, M2.user_id, TIMEDIFF(M2.created, M1.created) AS diff FROM msg M1 INNER JOIN msg M2 
    ON M1.user_id = M2.user_id 
    AND M1.created < M2.created
    WHERE DATE_ADD(M1.created, INTERVAL '24' HOUR) > M2.created
    GROUP BY M1.id
    Merci beaucoup!

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 036
    Points
    34 036
    Billets dans le blog
    14
    Par défaut
    Je vois un petit effet pervers à votre détection de tricheurs. Si je découvre votre jeu aujourd'hui à 15h30 et que je lis dans les règles que je ne peux jouer qu'une fois par jour, pourquoi ne pourrais-je pas jouer une seule fois demain mais à 7h30 avant de partir de chez moi pour la journée ?

    Ne serait-il pas meilleur de tester si un joueur a joué plusieurs fois par jour calendaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT user_id,
    	CAST(created AS DATE) AS jour,
    	COUNT(*) AS nombre
    FROM msg
    GROUP BY user_id, jour
    HAVING COUNT(*) > 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment extraire une lettre sur xml sans toute fois utiliser la position()
    Par sonnyanderson dans le forum XML/XSL et SOAP
    Réponses: 13
    Dernier message: 13/08/2013, 22h19
  2. VBA- comment extraire des données sur internet via un programme vba ?
    Par cecile_64 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 17/08/2012, 15h37
  3. [AC-2003] Comment ouvrir un etat sur base d'un QueryDef?
    Par Dermochelys dans le forum IHM
    Réponses: 7
    Dernier message: 30/11/2009, 14h59
  4. comment extraire des donnees sur un fichier xml en java
    Par mgueye dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 15/05/2008, 14h31
  5. Réponses: 7
    Dernier message: 12/09/2005, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo