sql: fo vraiment ke je my mette :D - Programmation
Marsh Posté le 10-04-2001 à 15:27:50
tu entends koi par la derniere date....si cest la plus recente alors tu devrais essayer avec un max
Marsh Posté le 10-04-2001 à 15:29:15
ouais, c la plus recente ke je veux... je vais essayer de suite merci.. trictrac .. Enfin, un chtit espoir...
Marsh Posté le 10-04-2001 à 15:35:56
oui... mais jaurais besoin de le mettre dans la condition where... avec un having? mais comment ?
Marsh Posté le 10-04-2001 à 15:40:41
comprends pas où est ton problème
Tu fais :
mysql_query("SELECT MAX(date) FROM tatable",$link);
[edit]--Message édité par joce--[/edit]
Marsh Posté le 10-04-2001 à 15:43:21
Tu fait :
select ...,date from ...
having date>=all in(select date from ...
;
La syntaxe est peut ê pas exacte mais c'est le principe, tu recherche une date supérieure ou égale (ce sera =)à toutes les dates de ta table!
Marsh Posté le 10-04-2001 à 15:46:16
ben, en fait, je veux faire un select du genre:
select c1,c2,c3
from t1
where max(la_derniere_date)
car, je veux uniquement la ligne la plus récente (du point de vue de la date et non pas de l'id), tu vois ?
paske jai essaye:
select c1,c2,c3,max(la_derniere_date)
from t1
Mais ca mrche pô
Meme dans un having le max() passe pô.. jsais plus comment faire..
Peut-etre par un subselect ... mais c pô possible autrement ?
Marsh Posté le 10-04-2001 à 15:47:48
avec un all in ... il est pas possible de faire sans ca ?
moi je pensais faire le sub select dans le from... c une bonne idee ?
Marsh Posté le 10-04-2001 à 16:01:17
ah ok
Ba faut faire :
select c1,c2,c3,max(la_derniere_date) from t1 GROUP BY la_derniere_date
Marsh Posté le 10-04-2001 à 16:02:24
ou alors :
select c1,c2,c3,la_derniere_date from t1 ORDER BY la_derniere_date DESC LIMIT 1
(perso je préfère ca)
Marsh Posté le 10-04-2001 à 16:12:41
il a raison joce:
select c1,c2,c3,max(date) from t1 ORDER BY date;
ça marche et c'est plus simple!
Oh la la ça remonte à loin les cours de SQL!!!!
Marsh Posté le 10-04-2001 à 16:12:55
le limit il reconnait pas... jsuis sous oracle 8...
et le group by il me dit ke c pas une expression group by
Marsh Posté le 10-04-2001 à 16:17:12
shinji a écrit a écrit : il a raison joce: select c1,c2,c3,max(date) from t1 ORDER BY date; ça marche et c'est plus simple! Oh la la ça remonte à loin les cours de SQL!!!! |
Avec mysql ca marche pas ca
Fo forcement un GROUP BY.
par contre effectivement
select c1,c2,c3,date from t1 ORDER BY date;
ca rulez (mais faut limiter au premier résultat).
Marsh Posté le 10-04-2001 à 16:17:42
wouatouwouatou a écrit a écrit : le limit il reconnait pas... jsuis sous oracle 8... et le group by il me dit ke c pas une expression group by |
Comment ca c'est pas une expression GROUPBY ?
Marsh Posté le 10-04-2001 à 16:19:55
je viens de tester et ca doit etre moi... mais ca marche tjrs pas...
pourtant jai fais le plus simple possible...
NOrmalement jai nue jointure mais meme en l'enlevant, ca marche pô...
Si vous pouviez me filer un chtit script avec
les tables person_contract, person
champ commun : pers_id
champ de person a prendre par le select : pers_fname, pers_lname
champ de person_contract a prendre pr le select: have_opening_date (c dessus ke je fait le max()),
account_number et have_relation_type
Merci d'avance ...
Marsh Posté le 10-04-2001 à 16:22:41
erreur ora-00979 : not a group by expression.
ma requete:
select pc.account_number, pc.have_relation_type, max(pc.have_opening_date)
from person_contract pc
where pc.pers_id<10
group by pc.have_opening_date;
Marsh Posté le 10-04-2001 à 16:24:07
wouatouwouatou a écrit a écrit : erreur ora-00979 : not a group by expression. ma requete: select pc.account_number, pc.have_relation_type, max(pc.have_opening_date) from person_contract pc where pc.pers_id<10 group by pc.have_opening_date; |
Essaie voir :
select pc.account_number, pc.have_relation_type, max(pc.have_opening_date)
from person_contract pc group by pc.have_opening_date having pc.pers_id<10;
[edit]--Message édité par joce--[/edit]
Marsh Posté le 10-04-2001 à 16:28:28
wouatouwouatou a écrit a écrit : le limit il reconnait pas... jsuis sous oracle 8... et le group by il me dit ke c pas une expression group by |
"select c1,c2,c3,max(la_derniere_date) from t1 GROUP BY la_derniere_date"
pas bon, dans le group by faut mettre tous les éléments
du select qui ne sont pas dans un max, sum...
il faut donc faire:
select c1,c2,c3,max(la_derniere_date) from t1
GROUP BY c1,c2,c3
Marsh Posté le 10-04-2001 à 16:29:29
wouatouwouatou a écrit a écrit : erreur ora-00979 : not a group by expression. ma requete: select pc.account_number, pc.have_relation_type, max(pc.have_opening_date) from person_contract pc where pc.pers_id<10 group by pc.have_opening_date; |
comme ci-dessus:
select pc.account_number, pc.have_relation_type, max(pc.have_opening_date)
from person_contract pc
where pc.pers_id<10
group by pc.account_number, pc.have_relation_type
Marsh Posté le 10-04-2001 à 16:33:41
je suis d'accord aussi
Enfin avec cette syntaxe, il va pas avoir le résultat qu'il veut :
ca va lui donner pour chaque combinaison de pc.account_number et pc.have_relation_type le max de pc.have_opening_date, et je sais pas si c'est ce qu'il veut
Marsh Posté le 10-04-2001 à 16:38:39
en effet, joce ... t'as raison... et c pas vraiment ce que je voulais..
Moi je voulais uniquement la ligne de derniere date
Ca march si je fait ke le max... mais si je veu daut' info... bah.. ca passe plus .
Marsh Posté le 10-04-2001 à 16:42:03
désolé j'ai pris le train en route
bon si les perfs ne te préoccupent pas, essaye :
select pc.account_number, pc.have_relation_type,
from person_contract pc
where pc.pers_id<10
and pc.have_opening_date in
(select max(pc.have_opening_date) from person_contract pc)
Marsh Posté le 10-04-2001 à 16:52:35
youpi !!!
Merci a tous... le truc de jupiler fonctionne..
Meme si on me dit toujours ke le in et not in c pas bo...
L'essentiel c ke ca marche...
Mais si vous avez un meilleur truc, n'hesitez pas
Moi de mon cote je continue a chercher et je vous tiendrai au courant si je trouve un truc mieux D
Marsh Posté le 10-04-2001 à 16:58:18
wouatouwouatou a écrit a écrit : youpi !!! Merci a tous... le truc de jupiler fonctionne.. Meme si on me dit toujours ke le in et not in c pas bo... L'essentiel c ke ca marche... Mais si vous avez un meilleur truc, n'hesitez pas Moi de mon cote je continue a chercher et je vous tiendrai au courant si je trouve un truc mieux D |
c'est clair que select in c'est jamais bon pour les perfs
si je suis inspiré, j'essayerai de trouver mieux
Marsh Posté le 10-04-2001 à 17:08:10
wouatouwouatou a écrit a écrit : youpi !!! Merci a tous... le truc de jupiler fonctionne.. Meme si on me dit toujours ke le in et not in c pas bo... L'essentiel c ke ca marche... Mais si vous avez un meilleur truc, n'hesitez pas Moi de mon cote je continue a chercher et je vous tiendrai au courant si je trouve un truc mieux D |
ba suffit de trouver comment limiter à un seul resultat
Marsh Posté le 10-04-2001 à 17:10:48
select rownum,c1,c2,c3,la_derniere_date from t1 WHERE rownum=1 ORDER BY la_derniere_date DESC
[edit]--Message édité par joce--[/edit]
Marsh Posté le 10-04-2001 à 17:12:15
select rownum,pc.account_number, pc.have_relation_type, pc.have_opening_date
from person_contract pc
where pc.pers_id<10 AND rownum=1
ORDER BY pc.have_opening_date DESC;
[edit]--Message édité par joce--[/edit]
Marsh Posté le 10-04-2001 à 17:20:21
rownum , c'est ca que je cherchais
bien vu
Marsh Posté le 10-04-2001 à 17:28:26
desole... mais le rownum, numerote les ligne dans lordre ou il les trouve pi vient seulement apres l'order by
Donc le rownum=1 marche pô
piske ca revient a faire retourne moi la premiere ligne que tu trouve, avant d'effectuer le tri par date...
Marsh Posté le 10-04-2001 à 17:39:00
wouatouwouatou a écrit a écrit : desole... mais le rownum, numerote les ligne dans lordre ou il les trouve pi vient seulement apres l'order by Donc le rownum=1 marche pô piske ca revient a faire retourne moi la premiere ligne que tu trouve, avant d'effectuer le tri par date... |
bonne remarque, qu'est-ce qu'il est con cet ORACLE
Marsh Posté le 10-04-2001 à 17:40:15
select pc.account_number, pc.have_relation_type,pc.have_opening_date
from person_contract pc
where pc.pers_id<10
and pc.have_opening_date = ( select max have_opening_date
from person_contract
where pers_id<10 )
voilou
Marsh Posté le 10-04-2001 à 17:57:07
ReplyMarsh Posté le 10-04-2001 à 18:01:22
ben... c t evident... pkoi jai p vu... me fo des vacances a moi
Marsh Posté le 10-04-2001 à 18:07:49
ddr555 a écrit a écrit : select pc.account_number, pc.have_relation_type,pc.have_opening_date from person_contract pc where pc.pers_id<10 and pc.have_opening_date = ( select max have_opening_date from person_contract where pers_id<10 ) voilou |
c'est exactement comme mon select in.
et pourquoi tu remets 2 fois pers_id < 10??
Marsh Posté le 10-04-2001 à 18:20:49
sinon le max il se fait sur toutes les lignes... or ce qui nous interesse c uniquement celles inferieures a 10...
Marsh Posté le 10-04-2001 à 18:26:34
select max(date) from table1
ou
select max(date) from table1 where champ1 < value
je ne sais pas qui est le plus rapide
je pense meme que c'est pire de faire 2* le test sur pers_id
[edit]--Message édité par jupiler--[/edit]
Marsh Posté le 10-04-2001 à 19:04:20
Mon pb. original etait assez simple a comprendre.. mais jarrive pas a l'expliquer
On peut le voir comme ca:
je fais un select avec jointure simple sur deux tables t1 et t2 ki me retourne tout plein d'infos t1.c1,t2.c2,t2.une_date ...
Mais voila ca ne me convient pas...
Car pour une meme valeur de t1.c1, je peux avoir plusieurs valeurs de t2.c2 (et donc t2.une_date).
Moi, je voudrais simplement les infos t2.c2 et t2.une_date avec t2.une_date valant la derniere date (la plus recente).
Ainsi, j'aurais une seule ligne correspondant a t1.c1, ki contiendrai entre autre l'info. t2.c2 la plus recente (i.e. max(t2.une_date)).
Voila mon pb. ... Malgre les reponses (merci encore pour tout), je n'arrive tjrs pas a recuperer ca... car la colonne t2.c2 donne toujours la meme chose ainsi que la date (ce ki est logique). Je n'arrive pas a avoir le max pour chacune des lignes t1.c1... voila tout... apres ca je vous embete plus.. au moins jusqu'au prochain pb de sql.
Voici ma requete... Mais elle est longue... alors je lai simplifiee un peu...
SELECT
p.pers_lname,
o.oper_id,
op.operation_date,
op.oper_id,
sp.status_short_label
FROM
operation o,
operation op,
status s,
status sp,
person p
WHERE
o.oper_pers_id=p.pers_id
AND o.oper_last_status_id=s.status_id
AND lower(s.status_short_label)='x'
AND o.affected_user_id=162
AND op.affected_user_id=o.affected_user_id
AND op.operation_date=(SELECT max(o.operation_date)
FROM operation o,
status s
WHERE o.affected_user_id=162
AND o.oper_last_status_id=s.status_id
AND lower(s.status_short_label)<>'x'
)
AND op.oper_last_status_id=sp.status_id
AND lower(sp.status_short_label)<>'x'
ORDER BY o.oper_realisation_date desc;
Voila voilou... kkun aurait une idee pour resoudre ce petit pb ?
[edit]--Message édité par wouatouwouatou--[/edit]
Marsh Posté le 11-04-2001 à 09:43:25
up .
Marsh Posté le 11-04-2001 à 10:08:18
moi aussi je dois m'y mettre mais je sais pas quel logiciel utiliser vous pouvez me conseiller ?
[edit]--Message édité par Drakkeng--[/edit]
Marsh Posté le 11-04-2001 à 10:14:15
bon wouatouwouatou:
essaye un truc du genre
select t1.c1, max(t2.date)
from t1,t2
where
t1.c1 = t2.c1 (si c1 est le champ qui permet la jointure)
group by t1.c1
ca doit te donner le max de la date correspondant à t1.c1
Marsh Posté le 10-04-2001 à 15:26:33
Ca y est jsuis dedans jusqu'au cou...
Voila je fais un select dans une table ki contient entre autres une date.
Comment kon fait pour n'avoir que la derniere date ?
un max ? ou un top ? bref, jsais vraiment pas ...
Aidez moi... c urgent... deja depuis hier... et la jsuis vraiment dans la mouise.
---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"