Har stött på ett problem som jag inte lyckas lösa! Varför ha två fråger? Du har fel i dina SQL-fårgor. Du gör en cross join, dvs an multiplicering av alla rader i den ena tabellen med alla i den andra. Sen filtrerar du bort vissa rader, men fortfarande blir det helt fel. Om vi tar den enklaste frågan du hade så kan du själv lägga till det i övriga: har testat exemplet... men den skriver ut de som "online" fast tiden gått ut... exemplen var gjorde ungefär exakt samma sak... har testat båda och båda får samma resultat... tex. en kille har stängt ner browsern utan att trycka på logga ut... hans OnlineStatus blir då "1" men tiden går juh ut efter ett tag... typ 5min och då ska han inte skriva ut honom som "Online" utan "Offline" kika på www.terroristsnigeln.com/abc/datediff.asp så ser ni problemet Men då måste du ha fel i datan, eller rättare sagt används den inte så som vi antog. Hur sätts OnlineStatus i Profiles? Och datumet, hur sätts det, samt vilket datum använder du i tmpdate? OK, nu har jag kollat på din sida, och jag måste säga att jag förstår ingenting. Andreas SQL-sats är som sagt inte korrekt SQL, men det är möjligt att det fungerar i MySQL. Däremot verkade den inte klara av min korrekta SQL-sats, eftersom sorteringen blev helt fel. Kan tänka mig att problemet kan vara något med datumjämförelsen. Var kommer förresten texten Offline och Online ifrån? Jag skulle vilja se resultatet av min fråga, utan nån sorts behandling i ASP, bara själva de sex kolumnerna som returneras. datumet sparas i databasen som DateTime (dvs. 0000-00-00 00:00:00) och OnlineStatus har tinyint(1) och online är alltså 1 och offline är alltså 0 så här ser koden ut... OK, vad jag menade var när och hur sätts datumet och onlinestatus i databasen? Öj... nu fattar jag... det funkade juh visst... jag som inte fattade det där med AS online riktigt bara... men om jag kontrollerar med den så har den juh satt den till 0 även om tiden gått ut osv... TACK som fan!!!!hjälp med SQL relationer och DateDiff
Har en vänner lista där mina vänner skrivs ut... man ska se om de är online osv.
Databasen innehåller 2 tabeller... Profiles och Friends...
Friends ser ut så här
id, MyUserID, FriendUserId
det vill säga jag vill hämta alla poster som har mitt användarID
Select * From Friends WHERE MyUserID = "mittid"
nu kommer det komplicerade och till det riktiga problemet... jag vill hämta användarinfo från "profiles"
alltså:
"SELECT profiles.Username, friends.MyUserId, friends.FriendUserId FROM profiles,friends WHERE friends.MyUserId = "mittid"
sen fortsätter vi, vi med att kontrollera om användaren är Online eller inte, dvs tiden gått ut för honom:
tmpDate = now()
"SELECT profiles.Username, friends.MyUserId, friends.FriendUserId, profiles.OnlineStatus, profiles.OnlineDateTime FROM profiles,friends WHERE friends.MyUserId = "mittid" AND profiles.OnlineStatus = '1' AND profiles.OnlineDateTime > ' "&tmpDate&"'
alltså hämta vänner som har mitt användarId, och dess onlinestatus = 1 och tiden inte gått ut...
det funkar så där... om tiden gått ut skriver han ändå ut användaren som den är ONLINE och när jag försöker göra en liknande SQL string för att skriva ut de som är OFFLINE kruppar den helt... den skulle ju sett ut något typ så här
tmpDate = now()
"SELECT profiles.Username, friends.MyUserId, friends.FriendUserId, profiles.OnlineStatus, profiles.OnlineDateTime FROM profiles,friends WHERE friends.MyUserId = "mittid" AND profiles.OnlineStatus = '0' OR profiles.OnlineDateTime < ' "&tmpDate&"'
hämta vänner som har mitt användareId, och dess onlinestatus = 0 ELLER tiden gått ut
ibland skriver den ut dem flera gånger efter varandra eller inte alls... ibland skriver den ut antal poster som jag har vänner osv...
nån som har tid att kika på detta problem eller ha några tips på lösningar? maila (robbin@terroristsnigeln.com) eller svara här!
Tack på förhand! Hoppas ni förstår ungefär mitt problem och vad jag vill åstakomma?Sv: hjälp med SQL relationer och DateDiff
SELECT profiles.Username, friends.MyUserId, friends.FriendUserId, (profiles.OnlineStatus = '1' AND profiles.OnlineDateTime > ' "&tmpDate&"') AS Online
FROM friends LEFT JOIN profiles ON friends.FriendUserId = profiles.UserId
WHERE friends.MyUserId = "mittid"
ORDER BY (profiles.OnlineStatus = '1' AND profiles.OnlineDateTime > ' "&tmpDate&"') DESC
Kommer lista alla dina kompisar. Varav det som är online överst.Sv: hjälp med SQL relationer och DateDiff
/* Frågan som är fel */
SELECT profiles.Username, friends.MyUserId, friends.FriendUserId FROM profiles,friends WHERE friends.MyUserId = "mittid"
/* Korrekt variant */
SELECT profiles.Username, friends.MyUserId, friends.FriendUserId
FROM profiles, friends
WHERE profiles.UserId = friends.FriendUserId
AND friends.MyUserId = "mittid"
Du måste alltså ange joinvillkor, annars får du en cross join. Om MySQL stödjer ANSI-92 syntax för joins (tror det, men jag kan inte MySQL så jag vet inte) kan du istället skriva så här, det är mycket tydligare:
SELECT profiles.Username, friends.MyUserId, friends.FriendUserId
FROM profiles
INNER JOIN friends
ON profiles.UserId = friends.FriendUserId
WHERE friends.MyUserId = "mittid"
Dock kan du förstås använda Andreas SQL-sats istället för att slippa flera SQL-satser. Dock tycker jag den ser konstig ut, det är möjligt att det fungerar i MySQL men i korrekt SQL skulle den varit:
SELECT profiles.Username
, friends.MyUserId
, friends.FriendUserId
, CASE
WHEN profiles.OnlineStatus = '1' AND profiles.OnlineDateTime > ' "&tmpDate&"'
THEN 1
ELSE 0
END AS Online
FROM friends
INNER JOIN profiles
ON friends.FriendUserId = profiles.UserId
WHERE friends.MyUserId = "mittid"
ORDER BY Online DESC
Jag bytte dessutom LEFT JOIN mot INNER JOIN då det känns mer korrekt, eller?Sv: hjälp med SQL relationer och DateDiff
Sv: hjälp med SQL relationer och DateDiff
Sv: hjälp med SQL relationer och DateDiff
1. killen "shiva" var inloggad för LÄNGE sedan och borde vara offline...
2. "Hell_Is_My_Witness" ska INTE hamna högst upp eftersom han är OFFLINE utan borde då flyttas ner UNDER "shiva" eller med tanke på att den ska sortera efter onlinestatus och tiden?Sv: hjälp med SQL relationer och DateDiff
Sv: hjälp med SQL relationer och DateDiff
Sv: hjälp med SQL relationer och DateDiff
pratade med en kille och han sa att det fanns nån fält typ där man automatiskt kunde sätta fältet till true eller false... men syndes i databasen som 0 & 1 (där 0 representar false) minns dock inte vad det hette? bin? och det fanns tydligen inte i MySQL
hur vill du att jag ska skriva ut fälten? utan formatering???Sv: hjälp med SQL relationer och DateDiff
<code>
<%
'FIXAR DATUMET
tmp = DateAdd("n",-5,Now())
tmpDate = Replace(FormatDateTime(tmp, vbShortDate) & " " & FormatDateTime(tmp, 3),"/","-")
'SQL
strSql = "SELECT profiles.OnlineStatus, profiles.OnlineDateTime, profiles.Username, friends.MyUserId, friends.FriendsUserId, CASE WHEN profiles.OnlineStatus = '1' AND profiles.OnlineDateTime > ' "&tmpDate&"' THEN 1 ELSE 0 END AS Online FROM friends INNER JOIN profiles ON friends.FriendsUserId = profiles.UserId WHERE friends.MyUserId = '"&MyId&"' ORDER BY Online DESC"
set ex2 = dbConn.Execute(strSQL)
%>
<%Do Until ex2.EOF%>
<%=ex2("OnlineDateTime")%>
<%=ex2("Username")%>
<%=ex2("OnlineDateTime")%>
<% ex2.MoveNext %>
<%Loop%>
</code>
av den lilla provisoriska tmpDate grejen får jag dagens datum -5 min exakt som det sparas i databasen ex. 2003-01-20 12:20:44Sv: hjälp med SQL relationer och DateDiff
Angående datumen tror jag nog du bör använda någon annan jämförelsemetod för datum än strängar så här, det kan hända att datumen representeras på olika sätt. Testa följande:
CASE WHEN profiles.OnlineStatus = '1' AND profiles.OnlineDateTime > CAST('"&tmpDate&"' AS datetime) THEN 1 ELSE 0 END AS Online
eller
CASE WHEN profiles.OnlineStatus = '1' AND DATEDIFF(n, profiles.OnlineDateTime, '"&tmpDate&"') > 0 THEN 1 ELSE 0 END AS Online
Observera att detta är lite SQL Server-syntax, så beroende på hur MySQL hanterar datumjämförelser kanske du måste byta ut denna mot nån MySQL-funktion.
Slutligen skulle jag som sagt vilja se outputen från frågan utan formattering, dvs något i stil med:
<code>
OnlineStatus OnlineDateTime Username MyUserId FriendsUserId Online
1 2002-11-12 00:01:01 namn 1234 4321 1
</code>Sv: hjälp med SQL relationer och DateDiff