Limiter sur un champs - SQL/NoSQL - Programmation
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.
Marsh Posté le 23-11-2010 à 09:07:35
mrbebert a écrit : SELECT * FROM maTable (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?
select * from matable
order by date desc
limit 4
[edit]
ah, j'avais pas vu qu'il y a des doublons.
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.
Marsh Posté le 23-11-2010 à 11:37:46
rufo a écrit : SELECT * FROM maTable GROUP BY date ORDER BY date DESC LIMIT 4 |
euh, non. Tu ne retourneras qu'une ligne par date, là.
Marsh Posté le 23-11-2010 à 11:42:01
skeye 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
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 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.
Marsh Posté le 23-11-2010 à 13:01:37
effectivement, j'avais pas bien compris l'énoncé...
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...
Marsh Posté le 23-11-2010 à 22:52:11
Du coup, je ne vois pas de solution en une seule requête
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
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
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?
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
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