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

Langage SQL Discussion :

Requete SQL soustraire 7 jours a une date


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 112
    Points : 48
    Points
    48
    Par défaut [Résolu]Requete SQL soustraire 7 jours a une date
    Bonjour, je souhaite effectuer une requête relativement simple
    Mais malgré plusieurs heures a chercher à gauche et a droite sur divers tuto et forums je n'ai malheureusement toujours pas trouvé la solution, c'est pourquoi je me permet de venir demander un peu d'aide auprès de vous, d'avance un grand merci !!!

    1. J'aimerais que ma requête me récupère dynamiquement dans le echo tout à la fin (echo $donnees3['entrees_NB']) le nombre de news postée par une certaine personne (variable $pseudo) lors des 7 derniers jours...

    2. en mettant deux dates fixe dans mon BETWEEN (DATE BETWEEN '28.04.09 ' and '05.05.09') il me sort un résultat erroné... je pense que c'est le format de la date dans ma base de donnée (
    les dates dans mon champ DATE sont insérées dans ce format : 05.05.09) qui pose problème, comment faire pour que ma requête fonctionne (et sans devoir changer de format de date dans la base de donnée) ?

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $retour3 = mysql_query("SELECT COUNT(*) AS entrees_NB FROM news Where PSEUDO ='".$pseudo."' AND DATE BETWEEN 'DATE DU JOUR -7 ' and '".date("d.m.y")."' ");
     
     
    $donnees3 = mysql_fetch_array($retour3);
     
     
    echo $donnees3['entrees_NB'];


    D'avance un grand merci pour la précieuse aide que vous pourrez me fournir
    Salutations à tous !

  2. #2
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Plusieurs choses ne vont pas :

    1) Ne pas nommer une colonne 'DATE', c'est un mot réservé du langage SQL.

    2) Une date se stocke en base de données dans une colonne de type DATE (ou DATETIME ou TIMESTAMP si en plus on a besoin de l'heure) dont le format standard est 'aaaa-mm-jj'. Vu que vos dates sont stockées apparemment sous la forme 'jj-mm-aa', il y a une erreur de conception qui vous pose maintenant des problèmes.
    Si vous pouvez changer la structure de la base, faites-le.

    Sinon, puisque vous utilisez MySQL, regardez du côté des fonctions DATE_DIFF et DATE_ADD dans la doc MySQL.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    2) Une date se stocke en base de données dans une colonne de type DATE (ou DATETIME ou TIMESTAMP si en plus on a besoin de l'heure) dont le format standard est 'aaaa-mm-jj'. Vu que vos dates sont stockées apparemment sous la forme 'jj-mm-aa', il y a une erreur de conception qui vous pose maintenant des problèmes.
    Non ça c'est faux ou mal expliqué !
    Une date se stocke dans un format date oui, mais la forme de stockage importe peu.
    Mais quand vous devez afficher ou insérer une date vous passez par un format d'affichage.

    Il faut toujours convertir vos chaînes en date avant d'envoyer un ordre SQL. Je ne connais pas la syntaxe en MySQL, mais la norme préconise l'emploi de la fonction CAST.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 112
    Points : 48
    Points
    48
    Par défaut
    bonjour, bon finalement les dates dans ma base ont été converties au format exact, je souhaiterai faire une double requête
    1. aller chercher et afficher tous les pseudo présent dans ma table membre
    2. compter pour chaque pseudo, le nombre de news postées dans la table news ces 7 derniers jours.

    j'ai fait ma requête, qui en passant fonctionne, mais j'ai un petit souci pour le cassement, j'aimerai classer tout cela par le nombre de news desc. mais ça ne marche pas... comment faire ?

    merci d'avance pour votre aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    	 <table>
    		<tr>
    			<td><h2>Pseudo</h2></td>
    			<td><h2>NB News Postées</h2></td>
    		</tr>
    <?
     
    $queryUser="SELECT PSEUDO FROM membre ORDER BY '".$news."' DESC"; //Je recherche dans ma table membre tous les PSEUDO
    $resultUser=mysql_query($queryUser);
     
    while($tab = mysql_fetch_assoc($resultUser)) // Je créer une boucle qui m'affichera tous les pseudo
     
     {
    		$pseudo=$tab['PSEUDO']; // la variable $pseudo affichera tous mes pseudo
    		$queryNews = mysql_query("SELECT COUNT(*) AS NB_news FROM news Where TYPE NOT LIKE '1' AND PSEUDO ='".$pseudo."' AND DATE BETWEEN '".date('Y-m-d', time()-7*24*3600)."' AND '".date('Y-m-d')."' ORDER BY NB_news DESC"); //je recherche dans ma table news, toutes les news postées les 7 derniers jours
    		$resultNews = mysql_fetch_array($queryNews); 
     
    		$news=$resultNews['NB_news']; //la variable news m'affichera le nombre de news	
    ?>
    		<tr>
    			<td><p><? echo $pseudo ?></p></td>
    			<td><p><? echo $news ?></p></td>			 
    		</tr> 		  
    <?
     } 
    ?> 
    </table>

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Le travers du programmeur, je fais une boucle puis j'en fais une autre

    Je reprends votre requête news que je fusionne avec votre requête membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        m.pseudo,
        count(*) AS nb_news
    FROM
        membre m
        LEFT OUTER JOIN news n -- la jointure externe vous donnera un nb_news à zéro pour ceux qui n'ont jamais posté
          ON n.pseudo= m.pseudo -- si vous aviez un id pour vos membres ce serait mieux
    WHERE
        n.type NOT LIKE '1' -- si type est un format numérique les quotes sont à enlever
    AND n.date >= '".date('Y-m-d', time()-7*24*3600)."' -- le between n'est pas nécessaire ici
    GROUP BY
        m.pseudo
    ORDER BY
        count(*) DESC

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 112
    Points : 48
    Points
    48
    Par défaut
    super merci beaucoup Waldar, c'est vraiment sympa !!

    mais je n'arrive pas à afficher mes données du champ pseudo de la table membre dans la boucle while, j'ai essayé :

    <? echo $tab['m.pseudo']; ?>
    <? echo $tab['n.pseudo']; ?>
    <? echo $tab['PSEUDO']; ?>
    <? echo $n.pseudo ?>
    <? echo $m.pseudo ?>

    etc.. mais rien n'y fait...

    désolé si mes questions sont un peu stupides, je débute en PHP


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    	 <table>
    		<tr>
    			<td><h2>Pseudo</h2></td>
    			<td><h2>NB News Postées</h2></td>
    		</tr>
    <?
     
    $queryUser="SELECT m.pseudo, count(*) AS nb_news FROM membre m LEFT OUTER JOIN news n ON n.pseudo= m.pseudo WHERE n.type NOT LIKE '1' AND n.date >= '".date('Y-m-d', time()-7*24*3600)."' GROUP BY m.pseudo ORDER BY count(*) DESC"; //Je recherche dans ma table membre tous les PSEUDO
    $resultUser=mysql_query($queryUser);
     
    while($tab = mysql_fetch_assoc($resultUser)) // Je créer une boucle qui m'affichera tous les pseudo
     
     {
     
    ?>
    		<tr>
    			<td><p><? echo $tab['PSEUDO']; ?></p></td>
    			<td><p><? echo $tab ['nb_news']; ?></p></td>			 
    		</tr> 		  
    <?
     } 
    ?> 
    </table>

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Je n'ai jamais codé une ligne de php, mais avez-vous essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <? echo $tab['pseudo']; ?>
    Sinon vous pouvez faire une alias avec AS - comme pour le nombre de news - au niveau du select.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 112
    Points : 48
    Points
    48
    Par défaut
    oui c'est tout bon je n'avais pas pensé a faire avec un alias !!

    Merci encore, dernière chose, promis après je met résolu dans le sujet :

    J'aimerais récupérer tous les pseudos qui sont dans la table membre et afficher la valeur 0 si parmi eux il y en a qui n'ont rien posté (il me semblait que c'était le cas vu votre commentaire //la jointure externe vous donnera un nb_news à zéro pour ceux qui n'ont jamais posté

    or avec cette requête je n'ai dans les résultats que les pseudos qui ont posté quelque chose

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Tout à fait, j'ai rajouté la jointure externe après coup et je l'ai mal fait.
    Utilisez ce code-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
        m.pseudo,
        count(*) AS nb_news
    FROM
        membre m
        LEFT OUTER JOIN news n
          ON n.pseudo= m.pseudo
         AND n.type NOT LIKE '1'
         AND n.date >= '".date('Y-m-d', time()-7*24*3600)."'
    GROUP BY
        m.pseudo
    ORDER BY
        count(*) DESC

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 112
    Points : 48
    Points
    48
    Par défaut

    Merci, cette fois il me les affiche tous mais les résultats des pseudo qui devraient normalement avoir la valeur 0 ont la valeur 1

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Au temps pour moi, les sorties de WE sont difficiles
    Remplacez count(*) par count(<un champ de news>).

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 112
    Points : 48
    Points
    48
    Par défaut
    cette fois c'est ok !

    Je te remercie infiniment d'avoir pris le temps de me répondre et de m'aider, c'est super sympa !!

    Bonne fin de journée

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

Discussions similaires

  1. Soustraire 7 jour d'une date
    Par abdego dans le forum VB.NET
    Réponses: 3
    Dernier message: 04/11/2012, 22h41
  2. [AC-2007] Requete Update sur le jour d'une date
    Par Jeronimo3 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/08/2011, 09h44
  3. soustraire 2 jours d'une date
    Par skins dans le forum Langage
    Réponses: 6
    Dernier message: 15/08/2010, 14h26
  4. Réponses: 7
    Dernier message: 27/12/2006, 17h54

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