Il doit exister une meilleure façon d'écrire cette requête.Développer la requête au-delà de celle spécifiée dans la clause WHERE
Je veux sélectionner toutes les données entre une paire de dates. Idéalement, les première et dernière lignes du jeu de résultats seraient celles spécifiées dans la clause WHERE. Si ces lignes n'existent pas, je veux que les lignes précèdent et suivent la plage demandée.
Un exemple:
Si mes données sont:
...
135321, 20090311 10:15:00
135321, 20090311 10:45:00
135321, 20090311 11:00:00
135321, 20090311 11:15:00
135321, 20090311 11:30:00
135321, 20090311 12:30:00
...
Et la requête est:
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 10:30:00'
AND datetime <= '20090311 12:00:00'
Je veux que les données renvoyées pour inclure la ligne à 10h15, et celui de 12h30. Pas seulement ceux qui respectent strictement la clause WHERE.
C'est le meilleur que j'ai trouvé.
SELECT * FROM (
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime > '20090311 10:30:00'
AND datetime < '20090311 12:00:00'
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime <= '20090311 10:30:00'
ORDER BY datetime desc
LIMIT 1
)
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 12:00:00'
ORDER BY datetime asc
LIMIT 1
)
)
AS A
ORDER BY datetime
(Ignorer l'utilisation de SELECT * pour l'instant)
EDIT: Je index sur les param_id, datetime, et (param_id, datetime)
Vous devrez ajouter param_id dans vos clauses ORDER BY pour l'index sur (param_id, datetime) à utiliser, comme ceci: ORDER BY param_id, datetime; ORDER BY param_id DESC, datetime DESC – Quassnoi