Limiter sur un champs

Limiter sur un champs - SQL/NoSQL - Programmation

Marsh Posté le 22-11-2010 à 22:25:57    

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
Reply

Marsh Posté le 22-11-2010 à 22:25:57   

Reply

Marsh Posté le 22-11-2010 à 22:57:04    

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.

Reply

Marsh Posté le 23-11-2010 à 09:07:35    

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 -
Reply

Marsh Posté le 23-11-2010 à 11:37:08    

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
Reply

Marsh Posté le 23-11-2010 à 11:37:46    

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 -
Reply

Marsh Posté le 23-11-2010 à 11:42:01    

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
Reply

Marsh Posté le 23-11-2010 à 11:43:38    

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 -
Reply

Marsh Posté le 23-11-2010 à 13:01:37    

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
Reply

Marsh Posté le 23-11-2010 à 22:35:18    

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...
 

Reply

Marsh Posté le 23-11-2010 à 22:52:11    

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.
Reply

Marsh Posté le 23-11-2010 à 22:52:11   

Reply

Marsh Posté le 24-11-2010 à 09:25:32    

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
Reply

Marsh Posté le 24-11-2010 à 17:07:31    

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

Reply

Marsh Posté le 24-11-2010 à 21:32:29    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed