Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1142 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Limiter sur un champs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Limiter sur un champs

n°2037681
pazi74
Posté le 22-11-2010 à 22:25:57  profilanswer
 

Bonjour,
 
Je viens de me mettre à la création de site web dynamique (PHP/MYSQL) et voilà qu'après de nombreuses heures de programmation, je tombe sur mon premier os. Mais bon, étant débutant de chez "Débutant" en base de donnée je vous demande conseil.
 
Voilà, j'ai une table qui ressemble à ca :  
 
id, nom, resultat, date
 
Sachant que pour une date donnée, il y a plusieurs enregistrements à ma table.
 
J'aimerais selectionner les lignes des "n" dernières dates les plus récentes. "n" étant fixé par avance.  
Par exemple, si je fixe "n" à 4, je voudrais sélectionner toutes les entrées des 4 dernières dates les plus récentes.
 
J'ai le début de la réponse :
 
SELECT * FROM maTable ORDER BY date DESC
 
Mais je ne sais comment indiquer dans la requete que je ne souhaite avoir que les 4 dernières dates de l'ordre décroissant.
 
Si vous avez une réponse, merci ! sinon je vais devoir compliquer mon code PHP et j'en ai pas très envie...
 
Édité par Elmoricq : pas de titre tout en majuscules.


Message édité par Elmoricq le 24-11-2010 à 10:14:17
mood
Publicité
Posté le 22-11-2010 à 22:25:57  profilanswer
 

n°2037687
mrbebert
Posté le 22-11-2010 à 22:57:04  profilanswer
 

SELECT * FROM maTable
WHERE date in (SELECT DISTINCT date FROM maTable ORDER BY date DESC LIMIT 4)
ORDER BY date DESC
 
(en supposant que le LIMIT soit accepté dans une sous-requête) :??:  
 
Pour les 4 dates les plus récentes, je prend les 4 premières lignes du tri par ordre décroissant.

n°2037742
skeye
Posté le 23-11-2010 à 09:07:35  profilanswer
 

mrbebert a écrit :

SELECT * FROM maTable
WHERE date in (SELECT DISTINCT date FROM maTable ORDER BY date DESC LIMIT 4)
ORDER BY date DESC

 

(en supposant que le LIMIT soit accepté dans une sous-requête) :??:

 

Pour les 4 dates les plus récentes, je prend les 4 premières lignes du tri par ordre décroissant.


wtf la sous-requête?[:pingouino dei]

 

select * from matable
order by date desc
limit 4

 

[edit]

 

ah, j'avais pas vu qu'il y a des doublons.[:dawak]


Message édité par skeye le 23-11-2010 à 09:08:37

---------------
Can't buy what I want because it's free -
n°2037771
rufo
Pas me confondre avec Lycos!
Posté le 23-11-2010 à 11:37:08  profilanswer
 

SELECT * FROM maTable GROUP BY date ORDER BY date DESC LIMIT 4
 
Ca devrait le faire.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2037772
skeye
Posté le 23-11-2010 à 11:37:46  profilanswer
 

rufo a écrit :

SELECT * FROM maTable GROUP BY date ORDER BY date DESC LIMIT 4
 
Ca devrait le faire.


euh, non. Tu ne retourneras qu'une ligne par date, là.


---------------
Can't buy what I want because it's free -
n°2037773
rufo
Pas me confondre avec Lycos!
Posté le 23-11-2010 à 11:42:01  profilanswer
 

skeye a écrit :


euh, non. Tu ne retourneras qu'une ligne par date, là.


 
Ben quand tu parlais des doublons, j'avais compris qu'il ne les fallait pas, d'où le group by. Du reste, la requête SELECT * FROM maTable
WHERE date in (SELECT DISTINCT date FROM maTable ORDER BY date DESC LIMIT 4)
ORDER BY date DESC
 
laisse à penser qu'on ne veut pas des doublons. Donc, pour éviter la sous-requête + le DISTINCT, je propose le group by en 1 seule requête ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2037774
skeye
Posté le 23-11-2010 à 11:43:38  profilanswer
 

rufo a écrit :

 

Ben quand tu parlais des doublons, j'avais compris qu'il ne les fallait pas, d'où le group by. Du reste, la requête SELECT * FROM maTable
WHERE date in (SELECT DISTINCT date FROM maTable ORDER BY date DESC LIMIT 4)
ORDER BY date DESC

 

laisse à penser qu'on ne veut pas des doublons. Donc, pour éviter la sous-requête + le DISTINCT, je propose le group by en 1 seule requête ;)

 

Des doublons sur les dates. Il veut toutes les lignes pour lesquelles la date est l'une des 4 plus récentes. Je ne vois pas d'autre solution que la sous-requête, du coup.


Message édité par skeye le 23-11-2010 à 11:43:44

---------------
Can't buy what I want because it's free -
n°2037783
rufo
Pas me confondre avec Lycos!
Posté le 23-11-2010 à 13:01:37  profilanswer
 

effectivement, j'avais pas bien compris l'énoncé... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2037948
pazi74
Posté le 23-11-2010 à 22:35:18  profilanswer
 

Hello,
 
Merci pour vos réponses. Désolé de n'avoir pas été clair, en effet, il y a des doublons par Date et la requete de Mr Bebert semblait idéale. Mais j'ai testé et en fait c'est bien ce que mrbebert redoutait, le LIMIT n'est pas autorisé dans une sous-requete...
 

n°2037949
mrbebert
Posté le 23-11-2010 à 22:52:11  profilanswer
 

Du coup, je ne vois pas de solution en une seule requête [:gargamail:5]  
 
1ère requête -> générer liste des n dernières dates
-- concaténation de tout ça en PHP --
2ème requête -> les lignes ayant l'une de ces dates


---------------
Doucement le matin, pas trop vite le soir.
mood
Publicité
Posté le 23-11-2010 à 22:52:11  profilanswer
 

n°2037991
rufo
Pas me confondre avec Lycos!
Posté le 24-11-2010 à 09:25:32  profilanswer
 

L'idée serait d'utiliser le having et d'arriver à mettre un nb incrémental de 1 à n en face de chaque date, incrémenté à chaque ligne de résultat
 
SELECT * FROM maTable
WHERE date in (SELECT DISTINCT date, NumIncrémenté FROM maTable HAVING NumIncrémenté <= 4 ORDER BY date DESC)
ORDER BY date DESC


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2038155
Oliiii
Posté le 24-11-2010 à 17:07:31  profilanswer
 

En SQL Server ce serai tout facil a faire avec un ROW_NUMBER(), il y a peut etre l'equivalent en MSSQL?

n°2038198
pazi74
Posté le 24-11-2010 à 21:32:29  profilanswer
 

Hello,
 
HAVING ne fonctionne pas non plus. Du coup je me suis replié sur une seule requete :
SELECT * FROM maTable ORDER BY date DESC  
 
Je parcours ensuite le resultat en incrémentant une variable PHP ($nb_date++) à chaque nouvelle date rencontrée :  
 
$date = "";
$nb_date = 0;
while ($ligne = $reponse->fetch()) {  
 if ($date != $ligne['date']) {
  $nb_date++;  
  $date = $ligne['date'];
 }
 if ($nb_date > 4) {
  break; // on sort de la boucle while
 }
        ...  
}
 
Merci pour votre aide


Message édité par pazi74 le 24-11-2010 à 21:32:58

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Limiter sur un champs

 

Sujets relatifs
[Résolu] Deux champs uniques[resolu][PHP & Oracle] Champs DateTime : recuperer la date ET l'heure
les champ d'une liste deroulante depende d'un champs.update ou pas d'un champs
Problème linguistique : champs ou colonnes ?recup champ aleatoire dans liste de champs
Access2003+état requete analyse croisée avec nombre champs variablesjointure avec 3 champs ?
MSSQL retourne un espace blanc si un champs est videvérifier les champs d'un formulaire contact
Plus de sujets relatifs à : Limiter sur un champs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR