[SQL] Requètes imbriquées ?

Requètes imbriquées ? [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 11-11-2015 à 10:53:11    

Bonjour,

 

Je stocke une valeur environ toutes les 10 minutes tous les jours.
Je cherche à faire une requête pour récupérer la première valeur stockée comprise entre midi et 13 heures, entre deux dates données.
Je dois donc recevoir une liste des premières valeurs inscrites après midi chaque jour.

 

Je suis donc parti sur un truc du genre :

 
Code :
  1. SELECT * FROM table WHERE date BETWEEN '2000-01-01' and '2000-01-05' WHERE heure BETWEEN '12:00:00' AND '13:00:00' LIMIT 1;


Évidemment, c'est faux. Mais je ne vois pas trop comment faire correctement la requête :/

 

Si quelqu'un peut m'aider :jap:


Message édité par _pollux_ le 12-11-2015 à 09:53:50

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 11-11-2015 à 10:53:11   

Reply

Marsh Posté le 12-11-2015 à 09:53:02    

J'ai commencé à regarder du côté des join in/right/left, mais je ne suis pas sûr d'y trouver mon bonheur.
 
C'est bizarre, le besoin semble plutôt simple et assez commun, mais je ne trouve pas de stratégie valable, ni d'exemple sur le net qui puisse correspondre...
 
:bounce:


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 12-11-2015 à 12:18:39    

Code :
  1. SELECT * FROM table WHERE date BETWEEN '2000-01-01' and '2000-01-05' AND heure BETWEEN '12:00:00' AND '13:00:00' LIMIT 1;


Reply

Marsh Posté le 12-11-2015 à 15:28:48    

Pablo Escrobarbe a écrit :

Code :
  1. SELECT * FROM table WHERE date BETWEEN '2000-01-01' and '2000-01-05' AND heure BETWEEN '12:00:00' AND '13:00:00' LIMIT 1;




Si c'est ça, j'suis très bête.
Mais le problème, c'est que la limite 1, elle va me retourner une seule valeur, non ? Or, je veux pour chaque jour cette première entrée entre 12h et 13h.


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 12-11-2015 à 19:58:10    

Bon, j'ai testé, ça ne me renvoie en effet que la première valeur trouvée (c'est à dire pour un seul jour).


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 15-11-2015 à 12:25:47    

POur se faciliter la vie, je te recommande, si tu peux, de faire un datetime comme type de champ plutôt que d'avoir un champ pour la date et un autre pour l'heure ;) DATE_FORMAT t'aidera si tu dois afficher que la date ou que l'heure.
 
Pour ce que tu veux faire, il faut effectivement faire une sous-requête et utiliser group by.


---------------
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 15-11-2015 à 17:34:15    

rufo a écrit :

POur se faciliter la vie, je te recommande, si tu peux, de faire un datetime comme type de champ plutôt que d'avoir un champ pour la date et un autre pour l'heure ;) DATE_FORMAT t'aidera si tu dois afficher que la date ou que l'heure.

 

Pour ce que tu veux faire, il faut effectivement faire une sous-requête et utiliser group by.


Oui, merci pour le conseil du datetime, c'est ce que je pensais faire vu les quelques exemples que j'ai pu trouver.
Concernant la requêtes elle même, je n'ai pas encore eu le temps de revenir dessus, mais je compte bien y passer un peu de temps cette semaine :jap:


Message édité par _pollux_ le 15-11-2015 à 22:16:58

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 15-11-2015 à 18:41:22    

Tu ORDER BY 'heure', tu GROUP BY 'date' et ca fera l'affaire.
 
Pas besoin de limite, de jointures ou de requêtes imbriquées.

Reply

Marsh Posté le 15-11-2015 à 22:18:49    

Gwy a écrit :

Tu ORDER BY 'heure', tu GROUP BY 'date' et ca fera l'affaire.

 

Pas besoin de limite, de jointures ou de requêtes imbriquées.


euh... je vois pas du tout là.

 

Order by heure et groupe by Date, c'est un peu laisser mes données dans l'état où elles sont initialement.


Message édité par _pollux_ le 15-11-2015 à 22:19:06

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 15-11-2015 à 22:42:50    

Ce que tu veux c'est bien pour chaque jour distinct la première valeur à l'intérieur de ta plage horaire ?

Reply

Marsh Posté le 15-11-2015 à 22:42:50   

Reply

Marsh Posté le 16-11-2015 à 08:55:54    

Gwy a écrit :

Ce que tu veux c'est bien pour chaque jour distinct la première valeur à l'intérieur de ta plage horaire ?


Oui, sur une certaine plage de jours.


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 16-11-2015 à 12:09:38    

Edit : J'ai dis une connerie, tu as bien besoin d'une requête intermédiaire car tu ne peux pas faire de GROUP BY après ton order...
 

Table test
-----------------------------------
 id   | time   | date   | value   |
-----------------------------------
 1    | 12     | 1      | a       |
 2    | 13     | 1      | b       |
 3    | 14     | 1      | c       |
 4    | 13     | 2      | d       |
 5    | 14     | 2      | g       |
 6    | 12     | 2      | z       |
 7    | 10     | 1      | y       |
-----------------------------------
 
SELECT sub.* FROM (SELECT * FROM `test` WHERE time > 11 AND time < 15 ORDER BY time ASC) AS sub GROUP BY sub.date
 
-----------------------------------
 id   | time   | date   | value   |
-----------------------------------
 1    | 12     | 1      | a       |
 6    | 12     | 2      | z       |
-----------------------------------


Message édité par Gwy le 16-11-2015 à 12:25:32
Reply

Marsh Posté le 16-11-2015 à 12:54:19    

ah, je check ça :)
 
Merci pour le temps passé en tout cas. :jap:


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 16-11-2015 à 14:12:17    

ça marche !  [:charlest]  
 
Merci pour l'aide ! Le seul truc que je comprends pas, c'est pourquoi ça ne me renvoie que la première occurrence trouvée entre les 2 heures fixées. :??:


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 16-11-2015 à 14:21:39    

Derien.
 
Ca c'est grace au group by.
Si tu veux le dernier enregistrement de la plage horaire il te suffit de changer l'ordre du tri dans la sous requête.


Message édité par Gwy le 16-11-2015 à 14:21:58
Reply

Marsh Posté le 16-11-2015 à 14:22:16    

Bah ton "Limit 1" fait ça non ?

Reply

Marsh Posté le 16-11-2015 à 15:08:31    

Pablo Escrobarbe a écrit :

Bah ton "Limit 1" fait ça non ?


Il n'y a plus de limit "1".
 
Par contre, effectivement, le GROUP BY ne récupère que la première occurrence pour chacune des dates (j'ai pas encore bien compris pourquoi, faut dire que je ne trouve pas d'explication précise de la fonction sur le net, que des exemples partiels). Comme elles sont classées dans l'ordre par heure ASC, ça fait le café.


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Sujets relatifs:

Leave a Replay

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