Avatar billede cleecer Nybegynder
09. oktober 2006 - 16:14 Der er 29 kommentarer og
1 løsning

udtræk baseret på numre i tabel

Hej

jeg har et problem mht. til sorteringen af et udtræk..

i tabbellen "content" har jeg "img_kat", der kunne se således ud:
"Annie Nightingale - the first female DJ (09.10.06)"

Kan det lade sig gøre vha. en SQL sætning at sorte indholdet af ovenstående baseret på datoen ?

Noget i stil med:

sql = "Select * from content ORDER by imgkat (int, reverse)"

Håber det kan lade sig gøre, ellers skal jeg på overarbejde...
- på forhånd tak.
Avatar billede zynzz Praktikant
09. oktober 2006 - 16:18 #1
Kan du ikke lave en ekstra række til datoen ?
Avatar billede b_ Nybegynder
09. oktober 2006 - 16:18 #2
Kan du ikke bare oprette endnu en attribut der indeholder datoen?
Avatar billede b_ Nybegynder
09. oktober 2006 - 16:19 #3
hov, der var een som var hurtigere med samme ide... hahaha
Avatar billede arne_v Ekspert
09. oktober 2006 - 16:20 #4
prøv og leg med noget lignende dette:

... ORDER BY CAST(SUBSTRING(imgkat,LOCATE('(',imgkat),8) AS DATE)

(utestet men du kan sikkert se ideen)
Avatar billede cleecer Nybegynder
09. oktober 2006 - 16:32 #5
ok Arne v, det prøver jeg lige... ER ikke så sikker på syntaksen i SQL sætninger, kan du evt. henvise mig til et eksempel el. lign på overstående ?
Avatar billede cleecer Nybegynder
09. oktober 2006 - 16:37 #6
Det ændre ikke de store... datoen står også lidt dumt... den skal jo faktisk sortere omvendt i strengen, så 09.10.06 bliver til 06.10.09  - kan man det ?
Avatar billede arne_v Ekspert
09. oktober 2006 - 17:30 #7
øh

huskede du CAST AS DATE ??
Avatar billede cleecer Nybegynder
09. oktober 2006 - 17:59 #8
Sorry det virker perfekt... Nu mangler jeg lige at håndtere udtrækket korrekt i den flash fil jeg sidder med, så skulle det spille... Sendt et svar - :0)
Avatar billede arne_v Ekspert
09. oktober 2006 - 18:04 #9
:-)
Avatar billede cleecer Nybegynder
09. oktober 2006 - 18:25 #10
Nej arne det virker sørme ik...

Rækkefølgen er forkert på nedenstående :
1 Annie Nightingale - The first female DJ in the World (04.08.06)
2 frank billeder fra månen (09.10.06)

- ?
Avatar billede arne_v Ekspert
09. oktober 2006 - 20:45 #11
hvad viser

SELECT imgkat,CAST(SUBSTRING(imgkat,LOCATE('(',imgkat),8) AS DATE) FROM tabelnavn

?

jeg mistænker lidt at der er et DDMMYY versus MMDDYY versus YYMMDD problem
Avatar billede cleecer Nybegynder
09. oktober 2006 - 20:49 #12
Stadig det samme problem..
Avatar billede arne_v Ekspert
09. oktober 2006 - 20:53 #13
hvad viser den query ?

hvilke datoer bliver 04.08.06 og 09.10.06 til ?
Avatar billede cleecer Nybegynder
09. oktober 2006 - 20:58 #14
De kommer ud på samme måde dvs.

1 Annie Nightingale - The first female DJ in the World (04.08.06)
2 frank billeder fra månen (09.10.06)
Avatar billede arne_v Ekspert
09. oktober 2006 - 21:04 #15
min 09/10-2006 query returnerer ikke det output - den skal ikke puttes ind
i din kode men bare udføres for at se hvad der sker
Avatar billede arne_v Ekspert
09. oktober 2006 - 21:05 #16
men er den rækkefølge iøvrigt ikke korrekt ?

2. august kommer før 9. oktober !

hvis det skal sorteres i omvendt rækkefølge skal der en DESC på til sidst
Avatar billede cleecer Nybegynder
09. oktober 2006 - 21:11 #17
OK du får lige det hele her, imgkat hedder i vikeligheden pris(ulogisk, men det var lettest for mig), men indeholder strenge som :

Annie Nightingale - The first female DJ in the World (04.08.06)
frank billeder fra månen (09.10.06) !

$sql="SELECT pris, CAST(SUBSTRING(pris,LOCATE('(',pris),8) AS DATE) FROM content WHERE pris!='' AND idmenupunkt='".$id."'";
$que=mysql_query($sql);
    while($res=mysql_fetch_object($que)){
echo $res->pris;
}
Avatar billede arne_v Ekspert
09. oktober 2006 - 21:13 #18
den skal stadig hen som ORDER BY i den rigtige kode

det her er kun for at troubleshoot det

$sql="SELECT pris, CAST(SUBSTRING(pris,LOCATE('(',pris),8) AS DATE) AS realdate FROM content WHERE pris!='' AND idmenupunkt='".$id."'";
$que=mysql_query($sql);
    while($res=mysql_fetch_object($que)){
echo $res->pris . " " . $res->realdate;
}

skulle vise hvad den fortolker de datoer som
Avatar billede cleecer Nybegynder
09. oktober 2006 - 21:16 #19
det kommer ud sådan her(hvis det er til at overskue):

headlines=Annie Nightingale - The first female DJ in the World (04.08.06),Annie Nightingale - The first female DJ in the World (04.08.06),Annie Nightingale - The first female DJ in the World (04.08.06),Annie Nightingale - The first female DJ in the World (04.08.06),David Ove (29.06.06),David Ove (29.06.06),David Ove (29.06.06),David Ove (29.06.06),Tue (19.04.06),Tue (19.04.06),Tue (19.04.06),Tue (19.04.06),Lau (14.03.06),Lau (14.03.06),Lau (14.03.06),Lau (14.03.06),Haniel (01.03.06),Haniel (01.03.06),Haniel (01.03.06),Haniel (01.03.06),Charlotte Vang (14.09.05),Charlotte Vang (14.09.05),Charlotte Vang (14.09.05),Charlotte Vang (14.09.05),Sadia (14.09.05),Sadia (14.09.05),Sadia (14.09.05),Sadia (14.09.05),Mahshid (14.09.05),Mahshid (14.09.05),Mahshid (14.09.05),Mahshid (14.09.05),frank billeder fra månen (09.10.06),frank billeder fra månen (09.10.06),frank billeder fra månen (09.10.06),frank billeder fra månen (09.10.06)
Avatar billede cleecer Nybegynder
09. oktober 2006 - 21:16 #20
ok prøver lige
Avatar billede cleecer Nybegynder
09. oktober 2006 - 21:18 #21
Den gør det samme... - forstår ikke hvorfor "frank billeder fra månen" ikke kommer først ?
Avatar billede cleecer Nybegynder
09. oktober 2006 - 21:26 #22
Den ser ikke ud til at ville skrive realdate...
echo $res->realdate;
virker ikke ?
Avatar billede cleecer Nybegynder
09. oktober 2006 - 22:06 #23
parenttesen '(' er vist indeholdt i den streng den prøver at behandle AS DATE - så det kommer ud som (09.10.0 ... kan det ikke passe ?
Avatar billede cleecer Nybegynder
09. oktober 2006 - 22:45 #24
Fant ud af at det her virker for mig:

$sql="SELECT image, bigImage, pris, SUBSTRING(pris,LOCATE('(',pris)+1,2) AS dd, SUBSTRING(pris,LOCATE('(',pris)+4,2) AS mm, SUBSTRING(pris,LOCATE('(',pris)+7,2) AS yy FROM content WHERE pris!='' AND idmenupunkt='".$id."' ORDER BY yy,mm,dd ";

Og så bruger jeg .reverse() på det array jeg får ind i swf'en.
Avatar billede kjulius Novice
10. oktober 2006 - 00:33 #25
Hvis du ønsker det i nedadgående dato-orden kan du skrive

ORDER BY yy DESC, mm DESC, dd DESC

I øvrigt ville jeg nok konvertere det til en date, som arne_v foreslog. Han brugte en CAST til Date, men jeg vil tro, at STR_TO_DATE funktionen er mere sikker, da man her kan angive, hvordan formatet på datostrengen er:

SELECT image, bigImage, pris, STR_TO_DATE(SUBSTRING(pris,LOCATE('(',8),'%d.%m.%y') AS Dato
FROM content
WHERE pris!='' AND idmenupunkt='".$id."'
ORDER BY STR_TO_DATE(SUBSTRING(pris,LOCATE('(',8),'%d.%m.%y') DESC

Fordelen ved en Date er bl.a., at den også kan sortere på århundreder, sådan at (10.05.99) faktisk kommer før (10.05.05).

I øvrigt kan det måske være lidt farligt at basere søgningen efter datoen i teksten på en LOCATE, for hvad hvis der er en parantes i selve teksten? Det kunne se ud som om, at datoen altid ligger sidst i strengen. I så fald var det måske bedre at tage udgangspunkt i tekststrengens længde:

STR_TO_DATE(SUBSTRING(pris, LENGTH(pris) - 8, 8),'%d.%m.%y')
Avatar billede arne_v Ekspert
10. oktober 2006 - 01:16 #26
STR_TO_DATE er den rigtige fordi da jeg selv prøvede 20:45:39 query fremgik det klart
at MySQL brugte YYMMDD

STR_TO_DATE(SUBSTRING(txt,LOCATE('(',txt)+1,8),'%d.%m.%y')

virker
Avatar billede cleecer Nybegynder
10. oktober 2006 - 15:11 #27
OK takker
Avatar billede cleecer Nybegynder
10. oktober 2006 - 15:18 #28
brugte STR_TO_DATE(SUBSTRING(pris, LENGTH(pris) - 8, 8),'%d.%m.%y') ! takker kjulius
Avatar billede cleecer Nybegynder
10. oktober 2006 - 16:45 #29
I kan se hvad jeg har brugt det til under http://www.rockbilleder.dk/index2.html --> portræt :0)
Avatar billede kjulius Novice
10. oktober 2006 - 17:42 #30
:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester