webForumDet fria alternativet

Stökig SQL-fråga

5 svar · 160 visningar · startad av Morph

MorphMedlem sedan juli 2000534 inlägg
#1

Håller på och bygger ett meddelande-system i ASP där man skall kunna bifoga en fil med sitt meddelande.

Jag har dessa tabeller:
messages:
---------
msgID - Räknare
sender - Tal
reciver - Tal
date - Datum
subject - Text
message - Text
file - Tal

files:
------
fileID - Räknare
filename - Text
contentType - Text

users:
------
userID - Räknare
name - Text

messages.file kommer från files.fileID för den bifogade filen, messages.reciver och messages.sender kommer från users.userID.

När jag ska lista meddelandena till en viss användare kör jag följande SQL-fråga:

strSQL = "SELECT messages.*, users.userID, users.name, files.* FROM messages, users, files WHERE messages.reciver="& Session("userID") &" AND messages.sender=users.userID AND (messages.file=files.fileID OR messages.file=0) ORDER BY [messages.date] DESC"

Problemet är att de poster som inte har någon fil bifogad (dvs messages.file är lika med 0) returneras tre gånger, annars fungerar det som det ska...

Någon som har en idé om hur jag ska skriva om SQL-frågan så den bara returnerar posterna en gång?

------------------
/Morph

Tech Support: "I need you to boot the computer."
Customer: (THUMP! Pause.) "No, that didn't help."

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Nja, av din beskrivning att döma så verkar det finnas flera poster i tabellen files där fileID = 0.

I så fall hjälper det inte att skriva om sql-satsen.

------------------
essentitia preter non sans multiplicandum

MorphMedlem sedan juli 2000534 inlägg
#3

Nä, det ska inte finnas några poster i tabellen files där fileID=0.

Om man skickar ett meddelande med en fil bifogad så "insert:as" en ny post i files-tabellen. Denna posts id-nummer trycks sedan in i messages.file.

Om man skickar ett meddelande utan fil så uppdateras inte files-tabellen och messages.file bli således 0.

Det finns alltså många poster i messages där file=0 och många där file="nåt värde ur files-tabellen"

------------------
/Morph

Tech Support: "I need you to boot the computer."
Customer: (THUMP! Pause.) "No, that didn't help."

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Jag tänkte lite fel där.

För de meddelanden som inte har någon fil bifogad så kommer du att joina med alla poster i filtabellen. Det blir alltså lika många förekomster av dessa rader som det finns poster i filetabellen. För att undvika detta så får du skriva en outer join i stället.


strSQL = "SELECT messages.*, users.userID, users.name, files.* " & _
         "  FROM (users join messages on userId = messages.sender )" & _
        "   left join files on file = fileId " & _
    " where messages.reciver="& Session("userID") & _ 
    " ORDER BY messages.[date] DESC"

Om du använder Access så brukar den vara lite petig om man har flera join, så att man kan behöva ange lite parenteser vid join-uttrycken för att den förstå ordentligt.

------------------
essentitia preter non sans multiplicandum

MorphMedlem sedan juli 2000534 inlägg
#5
strSQL = "SELECT messages.*, users.userID, users.name, files.* " & _
" FROM (users join messages on userId = messages.sender )" & _
" left join files on file = fileId " & _
" where messages.reciver="& Session("userID") & _ 
" ORDER BY messages.[date] DESC"

Funkade bra! Access klarade sig utan parenteser men ville ha INNER JOIN och inte bara JOIN...

Tusen tack! Du räddade min dag LarsG! :D

------------------
/Morph

Tech Support: "I need you to boot the computer."
Customer: (THUMP! Pause.) "No, that didn't help."

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Access klarade sig utan parenteser men ville ha INNER JOIN och inte bara JOIN...

Ok, skall komma ihåg, men detta verkar vara Access-specifikt att man måste skriva ut jointyp.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 12 aug 2001]

132 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)