un LIMIT strict et interne à la requête

VaN
Mammouth du PHP | 1107 Messages

21 mai 2010, 12:45

Bonjour,

J'ai une requête, qui pour simplifier, ressemble à ça :
SELECT COUNT(event_id) FROM events_agp ORDER BY event_date DESC LIMIT 2
Mon problème, c'est qu'elle me renvoie 20 (car j'ai 20 entrées dans cette table), alors que j'aimerai qu'elle me renvoie 2. Car en fait, ma requête est un peu plus compliquée que celle-ci, elle me renvoie autre chose qu'un simple COUNT, mais j'aimerai que ces données ne soient récupérées que à partir des 2 dernières entrées chronologiques, d'où le ORDER BY event_date DESC LIMIT 2, mais qui ne fonctionne pas comme je le désire, puisque apparement, le LIMIT s'opère seulement au moment ou la requête renvoie le résultat, pas directement dans la requête elle-même. Comment puis-je faire ?

Mammouth du PHP | 672 Messages

21 mai 2010, 12:51

Bonjour.

Non, non. Le LIMIT fonctionne bien.

Le problème, c'est qu'il limite le nombnre de ligne retournées.
Et dans le cas d'une requête COUNT (sans GROUP BY), on ne récupère qu'une ligne. Du coup, le LIMIT à 2 est inutile #-o

Il faut faire une requête imbriquée, qui va renvoyer les deux lignes, puis les compter...
SELECT COUNT(event_id) FROM (
SELECT event_id FROM events_agp ORDER BY event_date DESC LIMIT 2)
Après c'est difficile d'en dire plus, vu que tu ne donnes pas la requête qui te pose problème...

VaN
Mammouth du PHP | 1107 Messages

21 mai 2010, 14:16

En gros je veux compter le nombre d'absences (cas où presence_value > 1 dans la table events_agp_presences) sur les 2 derniers evenements (table events_agp) chronologiques, pour une structure donnée (presence_je_id = X).

Mes 2 tables :
CREATE TABLE IF NOT EXISTS `events_agp` (
`event_id` int(11) NOT NULL AUTO_INCREMENT,
`event_nom` varchar(100) NOT NULL,
`event_date` date NOT NULL,
`event_ville` varchar(100) NOT NULL,
`event_accepte_inscriptions` tinyint(1) NOT NULL,
`event_emargement_1_fichier` varchar(100) NOT NULL,
`event_emargement_2_fichier` varchar(100) NOT NULL,
`event_statut` tinyint(4) NOT NULL,
PRIMARY KEY (`event_id`),
KEY `event_statut` (`event_statut`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `events_agp_presences` (
`presence_id` int(11) NOT NULL AUTO_INCREMENT,
`presence_event_id` int(11) NOT NULL,
`presence_je_id` int(11) NOT NULL,
`presence_value` tinyint(4) NOT NULL,
PRIMARY KEY (`presence_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3079 ;
Et ma requête actuelle:
SELECT COUNT(presence_id) AS absences, event_date FROM events_agp LEFT JOIN events_agp_presences ON presence_event_id = event_id AND presence_je_id = '157' AND presence_value > 1 ORDER BY event_date DESC LIMIT 2
Du coup je vais essayer la requête imbriquée.