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 :

Clause LIMIT avec une condition


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 66
    Points
    66
    Par défaut Clause LIMIT avec une condition
    Bonjour,

    Je me trouve aujourd'hui devant une problématique qui dépasse mes connaissances :

    J'ai une table avec un champs date.
    Je souhaite faire une requête qui me renvoie tous les enregistrement dont la date est inférieure ou égale à celle d'aujourd'hui. Jusque là ça va je sais faire.

    Je veux aussi limiter le nombre de valeurs retournées à 5 dans certains cas (il semblerai qu'il y ai une cause LIMIT que je peux utiliser, donc c'est bon).

    Là où je bloque c'est que je veux faire intervenir une condition : je renvoie TOUTES les lignes dont la date est aujourd'hui, et si le nombre de ligne est inférieur à 5 je renvoie les lignes d'hier (ou d'avant hier si besoin) pour compléter mon résultat afin d'avoir tout le temps 5 lignes de renvoyées, quelque soit la date.


    Je sais pas si j'ai été suffisamment clair...
    Dans tous les cas je reste à votre disposition.
    Raphaël N.

  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 : 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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Le plus simple serait de modifier la condition sur la date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE colonne_date <= CURRENT_DATE
    ORDER BY colonne_date DESC
    LIMIT 5
    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 !

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 66
    Points
    66
    Par défaut
    Dans le cas où j'ai plus de 5 lignes avec la date d'aujourd'hui je ne veux pas de limitation :/ J'ai peut être pas été assez clair dans mes explications.

    Je veux afficher TOUTES les lignes avec currentdate, et si y en a moins de 5 je complète avec les lignes de la journée d'avant.

  4. #4
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu peux donner la requête complète ?

    Il y aurait beaucoup de données renvoyées par mon WHERE colonne_date <= CURRENT_DATE ?
    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 !

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 66
    Points
    66
    Par défaut
    Ma table est toute simple :



    Et ma requête pour le moment est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') as maDate
    FROM flb_news
    WHERE TO_DAYS(date) <= TO_DAYS(CURDATE())
    ORDER BY date DESC
    Donc comme vous pouvez le voir je n'ai pas encore ajouté la limite vu que je n'ai pas encore trouvé comment mettre la condition. En fait il faudrait quelque chose du genre : LIMIT 5 IF TO_DAYS(date) < TO_DAYS(CURDATE()

    Mais évidement ça n'existe pas :/



    EDIT : Oublié de répondre à ta question. Non il a entre 1 et 10 news par jour uniquement.

  6. #6
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Soyons fous ! Essaie ceci :
    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 news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    FROM flb_news
    WHERE TO_DAYS(date) <= TO_DAYS(CURDATE())
    ORDER BY date DESC
    CASE
    	WHEN
    	(
    		SELECT COUNT(*)
    		FROM flb_news
    		WHERE TO_DAYS(`date`) = TO_DAYS(CURRENT_DATE)
    	) < 5
    	THEN LIMIT 5
    	ELSE ''
    END
    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 !

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Soyons moins fous :
    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
    SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    FROM flb_news
    WHERE TO_DAYS(date) = TO_DAYS(CURDATE())
    UNION 
    (
    	SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    	FROM flb_news
    	WHERE TO_DAYS(date) < TO_DAYS(CURDATE())
    	AND NOT EXISTS 
    	(
    		SELECT 1
    		FROM flb_news
    		WHERE TO_DAYS(date) = TO_DAYS(CURDATE())
    	)
            ORDER BY date DESC
    	LIMIT 5
    ) 
    ORDER BY date DESC

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 66
    Points
    66
    Par défaut
    J'ai essayé ta méthode "folle" CinePhil mais sans succès, même en simplifiant les conditions au strict minimum il semblerai que l'instruction CASE ne soit utilisable qu'entre un SELECT et le FROM.


    Merci pour l'idée Fred_34 mais le NOT EXISTS empêche l'affichage des lignes supplémentaires lorsque par exemple il n'y a que 3 lignes à la date d'aujourd'hui. Et je vois pas comment faire à partir de ton idée :/



    Vos idées m'ont fait pas mal réfléchir quand même et en fait il faudrait un truc de ce genre :
    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 news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    FROM flb_news
    WHERE TO_DAYS(date) = TO_DAYS(CURDATE())
    ORDER BY date DESC
     
    UNION
     
    SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    FROM flb_news
    WHERE TO_DAYS(date) < TO_DAYS(CURDATE())
     
    LIMIT 5 - (SELECT COUNT(*) FROM flb_news WHERE TO_DAYS(date) <= TO_DAYS(CURDATE()))
     
    ORDER BY date DESC
    Mais malheureusement on ne peut pas faire d'opération dans la clause LIMIT on dirai (j'ai juste testé avec un LIMIT 1+1).


    Après je peux contourner le problème et traiter ça en PHP lorsque je récupère mes résultats. Mais bon pour moi c'est plutôt du boulot SQL qu'autre chose quand même :/

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    FROM flb_news
    WHERE TO_DAYS(date) = TO_DAYS(CURDATE())
    UNION 
    (
    	SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    	FROM flb_news
    	WHERE TO_DAYS(date) <=TO_DAYS(CURDATE())
            ORDER BY date DESC
    	LIMIT 5
    ) 
    ORDER BY date DESC

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 66
    Points
    66
    Par défaut
    Bah dans le cas où j'ai 5 news aujourd'hui il va quand même me sortir les 5 d'hier donc c'est pas encore ça Fred :/

  11. #11
    Membre habitué Avatar de Joel Pinto Ribeiro
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 95
    Points : 145
    Points
    145
    Par défaut
    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
    SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    FROM flb_news
    WHERE TO_DAYS(date) = TO_DAYS(CURDATE())
    UNION 
    (
    	SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') AS maDate
    	FROM flb_news
    	WHERE TO_DAYS(date) <=TO_DAYS(CURDATE())
          and (select count(*) FROM test
    WHERE TO_DAYS(date) = TO_DAYS(CURDATE())
    <6)
            ORDER BY date DESC
     
    )
    ORDER BY date DESC
    LIMIT 5;
    Et comme ça?
    Jeune ingénieur passionné des technologies Microsoft .NET, ainsi que du partage de connaissances.

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Et comme ça ?
    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
     
    SELECT news, auteur, `date`, maDate
      from (
    SELECT news, auteur, `date`, DATE_FORMAT(`date`, '[%d/%m/%y]') AS maDate
      FROM flb_news
     WHERE TO_DAYS(`date`) = TO_DAYS(CURRENT_DATE)
     union all
    SELECT news, auteur, `date`, DATE_FORMAT(`date`, '[%d/%m/%y]') AS maDate
      FROM flb_news
     cross join (select count(*) as nb from flb_news where TO_DAYS(`date`) = TO_DAYS(CURRENT_DATE)) t
     WHERE TO_DAYS(`date`) < TO_DAYS(CURRENT_DATE)
     order by `date` desc
     limit 5-t.nb
           )
     order by `date` desc
    Par contre je ne pense pas que ce soit vraiment plus pertinant de ne faire qu'une requête, comparé à récupérer les news du jour puis repartir cherché les news d'avant si nécessaire.

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par Fractaliste Voir le message
    Bah dans le cas où j'ai 5 news aujourd'hui il va quand même me sortir les 5 d'hier donc c'est pas encore ça Fred :/
    Pourquoi il sortirait les news d'hier?

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par joeminator Voir le message
    Et comme ça?
    Ah bien vu c'est assez malin. Il y a toujours le LIMIT 5 qui embête car le jour où on a 6 news aujourd'hui, on veut pouvoir dépasser cette limite.


    Citation Envoyé par Fred_34 Voir le message
    Pourquoi il sortirait les news d'hier?
    Ton premier SELECT va me sortir toutes les news d'aujourd'hui et le second va me ressortir 5 news (d'aujourd'hui ou avant).


    Citation Envoyé par skuatamad Voir le message
    Tu l'as testé skuatamad ? Parce que j'ai essayé un LIMIT 1+1 et il me refusait la requête soit-disant il y avait une erreur.




    Jme rend compte que c'est vraiment pas évident de faire comprendre ce que l'on cherche à faire. Peut-être qu'avec un exemple s'aurait été plus facile maybe ?

    Si je récapitule ce que je voulais (oui faut re-formuler) :

    • Si j'ai plus de 5 news aujourd'hui je les affiches toutes. C'est à dire si j'ai 7 news j'affiche les 7, si j'en ai 8 j'affiche les 8, etc... Bref dans ce cas on ne met pas de LIMIT
    • Si j'ai moins de 5 news aujourd'hui on affiches encore toutes celles d'aujourd'hui PLUS quelques une d'hier de façon à ce que au total (aujourd'hui + hier) on en ai 5 !




    Donc finalement je me suis rabattu sur la méthode alliant 1 requêtes COUNT, du PHP et une seconde requête pour mettre ma limite quand je le souhaite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $result = mysql_query("SELECT count(date) FROM flb_news WHERE TO_DAYS(date) = TO_DAYS(CURDATE()) ", $maConnexion);
    if(mysql_result($result, 0)>6) {
    	$myLimit = mysql_result($result, 0);
    }else {
    	$myLimit = 6;
    }
     
    $result = mysql_query("SELECT news, auteur, date, DATE_FORMAT(date, '[%d/%m/%y]') as maDate FROM flb_news WHERE TO_DAYS(date) <= TO_DAYS(CURDATE()) ORDER BY date DESC LIMIT ".$myLimit, $maConnexion);
    Merci à tous pour votre aide et si jamais vous avez d'autres solutions à proposer ça m'intéresserai vu que ça reste une problématique sympathique ; )

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Je peux me tromper, mais je pense vraiment que la solution que j'ai proposée est correcte.

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Je peux me tromper, mais je pense vraiment que la solution que j'ai proposée est correcte.
    Oh exact j'avais mal compris ta proposition en fait, j'avais pas vu la subtilité de l'UNION. C'est toi qui a trouvé la solution au final, t'as bien fait d'insister j'avais des oeillères qui m’empêchaient de percuter : p

    Un gros merci à toi !

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

Discussions similaires

  1. [MySQL] Creer une clause WHERE avec deux conditions donne erreur
    Par Salsaboy60 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/04/2014, 10h39
  2. Problème avec une condition
    Par ghan77 dans le forum Débuter
    Réponses: 2
    Dernier message: 16/12/2005, 16h18
  3. Réponses: 3
    Dernier message: 24/10/2005, 13h47
  4. Problème de requête avec une condition IN
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2005, 11h56
  5. envoyer submit avec une condition !
    Par delphinote dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 01/07/2005, 15h52

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