liljaMedlem sedan juli 20041 183 inlägg Hej jag har ett litet problem. Jag skulle vilja kunna hämta data ifrån tre tabeller och sortera efter datum som är en kolumn i alla tabellerna... Detta för att kunna skriva ut alla poster sorterat efter datum...
de tre tabellerna heter Trainings, Competitions och Events och i alla tre finns dDatum...
Jag använder ASP, Access som databas och skriver ut med recorset
Det hela handlar om att man ska kunna visa alla träningar, tävlingar och andra händelser som sker på, säg en månad, sorterat efter datum. Alltså inte alla träningar först, tävlingar sen eller liknande. Datumen ska bestämma ordningen...
jonnyzMedlem sedan okt. 2004502 inlägg Det känns som den bästa lösningen är att korrigera databasdesignen - det är förhoppningsvis inte för mycket jobb.
Jag får nämligen uppfattningen av att de tre tabellerna är så pass lika att de egentligen borde vara samma tabell. Om du lägger allt i samma tabell kan du lägga till ett fält som skulle kunna heta "EventType". Detta fält kan vara 1 för träning, 2 för tävling och 3 för övriga event.
Du kan sedan selektera ut alla träningar för sig om du vill samtidigt som du kan få ut allt sorterat på ett fält. Jag gissar att det även finns prestanda vinster med detta tillvägagångssätt.
liljaMedlem sedan juli 20041 183 inlägg jo jag slogs också av den iden. bara det att i tävlings-tabellen finns det åtminstonne 5 fler fält som aldrig kommer att användas om man skriver in en träning eller annan händelse...
om jag inte har helt fel så tar väl de tomma fälet upp platts även om det inte står något i dem? därför som man bör ange hur många tecken bred en post får vara...
nu kanske utrymmet inte är ett jätteproblem i dagens och jag kan lätt ändra men jag är ändå nyfiken på hur man gör till en annan gång :)
Låste om något sätt man kunde lösa ett liknande problem på med relationer inblandat i en annan tråd. Fast det är inte samma problem. Sen läste jag på en hemsida att man separerar sqlsattser med ett semikolon. Men då kommer, som jag uppfattar det som, först posterna ifrån en tabell och sen posterna ifrån en annan...
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Du har helt rätt, det tar säkert upp plats, hur mycket kan jag absolut inte avgöra. Tror dock att det är ett mindre problem i Access än i SQL-server, där fält får en viss storlek?
Men, som du skriver är detta oftast inget problem.
OM du vill göra något åt det, gör du en ny tabell som innehåller id och de fem fälten, som du endast fyller när det är en sådan Eventtype som du matar in.
(Dra INGA relationer i relationsfönstret, då MÅSTE du stoppa in något i denna nya tabell för alla typer. Tror det inte går annars. Och isåfall är ju vitsen med fältsparningen borta.)
UNION kanske du har läst om också, då kan du få allt i samma recordset, även om du har rubrik på ett fält, som heter fnamn i andra tabellen.
Du kan även testa med"SELECT * FROM tbl1, tbl2, tbl3", går det?
Men, jag råder dig att lägga allt i samma tabell, som jonnyz skriver, det är enklast.
LarsGMedlem sedan dec. 200012 464 inlägg Använd Union.
Om det är olika saker finns det ingen anledning att lägga det i samma tabell, tvärtom.
Flyttas från ASP
liljaMedlem sedan juli 20041 183 inlägg men om jag använder union så skrivs ju all data ut ifrån första tabellen först och sen skrivs all data ifrån andra tabellen ut därefter...
I båda tabellerna har jag en post som heter dDate och vill sortera så att all data ifrån båda tabellerna skrivs ut i rätt ordning efter datumet... DVS jag blandra poster ifrån båda tabellerna...
LarsGMedlem sedan dec. 200012 464 inlägg
men om jag använder union så skrivs ju all data ut ifrån första tabellen först
Nej, så är det inte. De hämtas i den ordning du anger i order by. Om du inte har någon order by så kan du aldrig veta i vilken ordning de returneras.
select ...,dDate,... from t1
union all
select ...,dDate,... from t2
union all
select ...,someOtherDate,... from t3
order by dDate desc
liljaMedlem sedan juli 20041 183 inlägg Okej, det fungerar :) Men jag fattar inte hur jag skriver ut datan i ASP
SQL-strängen:
SQL = "SELECT * FROM Competitions"
SQL = SQL & " UNION ALL"
SQL = SQL & " SELECT * FROM Events"
SQL = SQL & " ORDER BY dDate ASC"
For sattsen:
For i = 0 to 5
Response.Write objRs("dDate") & "<br>"
If objRs("mMore") <> "" Then
Response.Write "Tävling: " & objRs("mMore") & "<br>"
Else
Response.Write "Händelse: " & objRs("mEvent") & "<br>"
End If
Response.Write "<br>"
objRs.MoveNext
Next
Om jag kör den for sattsen fungerar det men framför varje RecordSet skrivs "Tävling" ut. Enligt vad jag tycker ska det stå Händelse framför alla händelser och Tävling enbart framför alla tävlingar...
Rättare sagt, hur kollar jag ifrån vilken tabell datan kommer?
LarsGMedlem sedan dec. 200012 464 inlägg Förmodligen så ligger det null i kolumnen mMore
If "" & objRs("mMore") <> "" Then
liljaMedlem sedan juli 20041 183 inlägg 1. Om jag försöker skriva ut alla mMore så går det bra förutom att alla mEvent följer med...
2. Om jag försöker skriva ut alla mEvent får scriptet fnatt och tror inte att det finns någon mEvent i min databas. Jag får följande meddelande :(
ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.
/layout_05/test/tables/Default.asp, line 23
liljaMedlem sedan juli 20041 183 inlägg Om jag istället använder förljande script:
do until objRs.EOF
for each x in objRs.Fields
Response.Write(x.name)
Response.Write(" = ")
Response.Write(x.value & "<br />")
next
Response.Write("<br />")
objRs.MoveNext
loop
får jag följande resultat...
CompetitionID = 1
mMore = Event 1
dDate = 2004-03-25
tWhere = Träning
CompetitionID = 1
mMore = competition 1
dDate = 2004-08-09
tWhere = Vetlanda
I första RecordSettet skulle CompetitionID heta EventID och mMore skulle heta mEvent... Dessutom så ska tWhere vara tType.
Alltså verkar det som att när jag infogat tabellen Competition och ska infoga tabellen Events så ersätts alla kolumn-namnen i Events med dem som är i Competitions... Det är i alla fall vad som händer enligt mig. Hur kan man fixa detta problemet förutom att ordna om i databasen så att man får en tabell för allt?
LarsGMedlem sedan dec. 200012 464 inlägg Det stämmer. Namnen i recordsetet kommer från den första select-frågan.
Du kan lägga till en extra kolumn så att du vet från vilken tabell posten kommer
select ...,dDate,...,1 as origin from t1
union all
select ...,dDate,...,2 from t2
union all
select ...,someOtherDate,...,3 from t3
order by dDate desc
och sedan
if cint(rs("origin")) = 1 then
' data från första tabellen
...
end if
liljaMedlem sedan juli 20041 183 inlägg Okej, men hur kan jag då skilja på om det är tabell 2 eller 3 som just ett RecordSet tillhör och mina Recordset får väl fortfarande namn efter den första tabellen?
går det inte att fixa så att om ett reckordset ifrån Events heter mEvent och inte mMore? Blir rädd för att det kommer bli för krångligt att hålla redan på en så simpel sak som namnen om man inte kan använda de namnen som finns i databasen...
hoppas ni förstår? :/
Såhär ser databasen ut...
Competitions: (tabell)
- CompetitionID
- mMore
- tWhere
Events: (tabell)
- EventID
- mEvent
- tWhat
LarsGMedlem sedan dec. 200012 464 inlägg Ett recordset tillhör inte någon tabell.
Okej, men hur kan jag då skilja på om det är tabell 2 eller 3
Det var det jag visade med hjälp av kolumnen som jag döpte till origin.
liljaMedlem sedan juli 20041 183 inlägg okej nu fattar jag de, tack :)
Men ReckordSettem får fortfarande sina namn ifrån den första tabellen, om det är fler reckordset i tabell 2 än 3 då? Eller om de är av olika datatyp. Typ mMore är av datatypen tal och mEvent är av datatypen text... För mEvent är ju detsamma som mMore i ReckordSettet efterssom alla ReckordSet namnges efter första tabellen?
ni kan se hur det ser ut här just nu:
http://www.jonkopingsok.nu/layout_05/test/tables/