21. juni 2001 - 05:06Der 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...
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) ?
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...
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.
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.
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.
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\"
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...
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
Synes godt om
Ny brugerNybegynder
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.