Avatar billede pollas Nybegynder
21. juni 2001 - 05:06 Der er 10 kommentarer og
1 løsning

sql-samling af fire felter til dropdown

Et lille problem, der tidspunktet taget i betragtning forekommer uoverskueligt:

Jeg har fire forskellige felter (alle dato-felter) i min database. Nu vil jeg godt have vist alle datoer for alle poster, men valgt distinct, så der kun er een af hver. Jeg forestiller mig, at det må være noget med at hive data ud fra alle felter og så filtrere dem på en måde, men jeg kan som sagt ikke lige se det for mig...

Det skal bruges til en dropdown, hvorfor jeg har brugt for eet feltnavn jeg kan smide i min asp. Håber det er forståeligt...

På forhånd tak,

/A
Avatar billede sone Nybegynder
21. juni 2001 - 08:43 #1
Hvis de 4 felter indeholder forskellige datoer, skal det så blive til en dropdown med 4 elementer, eller en dropdown med x*4 elementer (hvor x er antallet af poster i tebellen) ?
Avatar billede pollas Nybegynder
21. juni 2001 - 12:39 #2
Altså (prøver at foklare så godt jeg nu kan - har ikke sovet siden sidst...)

Jeg har cirka 30 poster i basen, hver med 4 datofelter (dato1, dato2...dato4). Disse datoer kan være alt - de vil være forskellige inden for den enkelte post, men kan meget vel overlappe med andre posters dato-felter (ikke nødvendigvis dato1 til dato1, men alle kombinationer).

Det jeg gerne vil, er fra alle posters 4 felter at hive alle datoer ud distinkt, dvs. en forekomst et-eller-andet sted i de 4 dato-felter i alle posterne, og smide den i en enkelt dropdown. Der altså skal vise, hvilke datoer, der gemmer sig. I tanken er det jo noget med at gøre de fire felter til et, hvorefter indholdet vælges distinkt.

Er der ingen vej udenom at vedligeholde en ekstra tabel med enkeltforekomster af datoerne...
Avatar billede webbe Nybegynder
21. juni 2001 - 13:12 #3
Som jeg forstår dig vil du kun have vist datoerne én gang....altså hvis datoen 31/12-2001 går igen 13 gange skal den kun vises én gang i din dropdown.

Det gør du ved at lave en \"GROUP BY\" i din sql-sætning!

fx.

sql = \"SELECT * FROM tablename GROUP BY Dato1, Dato2, Dato3, Dato4\"
Connect.execute(sql)
Avatar billede respen Nybegynder
21. juni 2001 - 15:00 #4
Som jeg forstår det så vil du have distinct datoer, lige meget om det er i dato1,dato2,dato3 eller dato4.

Måden du gør det på er følgende:

(SELECT DISTINCT (dato1) AS svar
FROM TABLE1
UNION
SELECT DISTINCT (dato2) AS svar
FROM TABLE1
UNION
SELECT DISTINCT (dato3) AS svar
FROM TABLE1
UNION
SELECT DISTINCT (dato4) AS svar
FROM TABLE1)

Du spørger så bare på dit recordset på fieldet \"svar\" for at få din dropdownboks udfyldt.
For at være sikker på at du får de distincte ud, må datatypen være \"smalldatetime\".

Det er måske en god idé at lave en order by klausul, for at få det ud lidt mere struktureret.

Respen
Avatar billede pollas Nybegynder
21. juni 2001 - 20:16 #5
respen>> jeg får en fejl på sætningen, og synes nu også pludselig at kunne erindre, at min base (mySQL) vist ikke kan foretage unions... :(

Hvad gør man så? Og hvorfor skulle jeg bruge smalldate?

Var selv ude i noget med aliaser, men havde ikke union-tingen med...
Avatar billede respen Nybegynder
21. juni 2001 - 20:39 #6
pollas>>
Jeg ved ikke hvordan det er med mySQL, men det fungere fint på mssql-serveren (har testet det). Jeg mener at UNION er standard SQL, så det undre mig hvis mySQL ikke understøtter dette.

Ang. Smalldate:

Da en dato af datatype datetime er repræsenteret med dd-mm-yyyy hh:mm:ms, vil to dage med tid (jeg går ud fra at du vil præsentere unikke dage og ikke unikke dage og tidspunkter), være at finde i din select. Du kan selvfølgelig lave en casting på datatype datetime til smalldate (el. date i andre database miljøer). Jeg ved dog ikke så meget om mySQL, så jeg ved ikke hvad datatyper er.

Jeg vil lige kikke på det igen, og se om der er en anden måde end union, hvis du ikke kan få det til at fungere.

Ved du forøvrigt hvor jeg kan få fat i mySQL?

respen
Avatar billede pollas Nybegynder
21. juni 2001 - 20:43 #7
Jeg troede også det var standard, men fik smidt et citat fra manualen efter mig engang jeg spurgte, hvor der vist stod noget om at \"det håbede man at tilføje en dag\"...

MySQL kan hentes fra www.mysql.com (og andre steder). Den er mægtig fin og kører rimeligt med asp, men der er vist et par mangler :)

Mine datoer er i forvejen som ren dato (muSQL: date), så det er intet problem - men nu forstår jeg.
Avatar billede respen Nybegynder
21. juni 2001 - 21:03 #8
Pollas>>

Jeg har været inde og kikke på dokumentationen på mssql hjemmeside, og fandt denne løsning(som jeg har modifiseret lidt):

CREATE TEMPORARY TABLE tmp
INSERT INTO tmp
SELECT distinct(dato1) as svar FROM table1
INSERT INTO tmp
SELECT distinct(dato2) as svar FROM table1
INSERT INTO tmp
SELECT distinct(dato3) as svar FROM table1
INSERT INTO tmp
SELECT distinct(dato4) as svar FROM table1

SELECT distinct(svar) from tmp;
DROP TABLE tmp;

Jeg har ingen anelse om det virke, men jeg syntes det ser lovende ud.

Iøvrigt afsnittet hvor jeg fandt informationen var:
\"9.5.7 Searching on Two Keys\"

respen
Avatar billede pollas Nybegynder
21. juni 2001 - 21:50 #9
Aha... ikke dumt - er der en reel forskel på alm. og midlertidige tabeller?

Var lidt ude i noget table-merge, hvorefter union skulle kunne lade sig gøre...

Takker - kigger på det!

/A
Avatar billede pollas Nybegynder
21. juni 2001 - 23:37 #10
Nå, så virker det. Jeg havde ikke held med at bruge TEMPORARY i tabel-oprettelsen, ligesom IF NOT EXIST heller ikke ville fungere. Måske er det noget med versionen - jeg kører MySQL 3.22.32. Blev også nødt til at definere typer...fair nok :)

Ellers var det jo et fint forslag. Men hvordan er det nu, at man tager længere sql-sætninger (som dit eksemplet med flere linjer af bl.a INSERT) og fyrer af som een i asp? Jeg har måttet dele den op og conn.execute\' den flere gange, hvilket vel ikke er så heldigt...

Jeg takker mange gange for den solide indsats!
Avatar billede respen Nybegynder
22. juni 2001 - 12:21 #11
Hej Pollas

Det er da lidt træls at Temporary ikke virker, så du må nok leve med at have en tabel til udskilningen.

I øvrigt har jeg downloadet den nyeste version(3.23.33) af mssql - måske er der mulighed for der at bruge temporary tabeller.

Jeg ved ikke helt nøjagtig hvordan temporary tabels virker i mssql. Men et kvalifiseret gæt ville være at den kun \"lever\" i memory og ikke i databasen som sådan.

ang. sql strengen, mener jeg at streng variabler kun kan tage 255 tegn af gangen. Du kan evt. dele tildelingen op i flere segmenter:

sqlstreng=\"INSERT INTO tmp SELECT distinct(dato1) \"
sqlstreng=sqlstreng +\"as svar FROM table1
INSERT INTO tmp \"

osv...

Jeg siger selv tak, det har været en kanon session. Jeg har skam også lært en del af det!

respen

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
Kurser inden for grundlæggende programmering

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