webForumDet fria alternativet

Göra join utan relationer

Databaser & SQL

38 svar · 1 267 visningar · startad av WebbisNet · sida 2 av 2

Frågan, av WebbisNet

Hur gör man en join i/för MySQL som inte kan hantera relationer som Access kan, har gått över från Access till MySL och jag vill kombinera tblUsers med tblUsersvisitors I access funkade detnär jag hade relationer men skiter sig med MySQL Vill ha 2 poster från tblUsers och alla poster från tblUsersvisitors och den gemensamma nämnaren är användarID-t bild bifogas

Läs frågan i sin helhet →
Medlem sedan dec. 19996 721 inlägg
#21

Mer specifikt vill jag se koden där visitor-recordsetet skapas, och raderna runt detta

Medlem sedan feb. 20032 027 inlägg
#22
if view("sex")="F" then
gender="Kvinna"
else
gender="Man"
end if

if CBool(view("inloggad")) then
online="<font color=""green"">Online</font>"
else
offline="<font color=""red"">Offline</font>"
end if

username=view("username")

Set visitor=objConn.Execute("SELECT DISTINCT ID, userID, username, HomeUserId, HomeVisitorId, HomeDateVisited, HomeTimeVisited FROM tblusers_visitors INNER JOIN tblUsers ON tblusers_visitors.HomeVisitorID = tblUsers.userid WHERE HomeUserId="& request("userID") &" ORDER BY ID DESC limit 5")

lUserId = request("userID")   '# krypinets ägares id
lVisitorId = CLng(UserID)   '# besökarens id
commDate=Date()
commTime=Time()
if lUserId <> lVisitorId then
objConn.execute "INSERT INTO tblUsers_visitors (HomeUserId, HomeVisitorId, HomeDateVisited,HomeTimeVisited) VALUES(" & lUserId & "," & lVisitorId & ",'" & commDate & "','" & commTime & "')"
end if

imageLink="Http://images.webbisen.com"%>

<SCRIPT LANGUAGE="JavaScript" src="/include/scripts.js"></script>

<script language="JavaScript" type="text/javascript">
<!--
function Pic(PID)
{ 
window.open("/viewPic.asp?ID="+PID,"Pic","left=100, top=100, location=no, toolbar=no, scrollbars=no, resizable=no");    
}
//-->
</script>
Medlem sedan feb. 20032 027 inlägg
#23

Hur får man förresten
antalKillar=Cint(killar("Antal")/sum("Antal")*100)
antalTjejer=Cint(tjejer("Antal")/sum("Antal")*100)

att funka i MySQL

Nu har jag två olika frågor som jag gärna vill lösa :-)

Medlem sedan dec. 19996 721 inlägg
#24

Vi testar...

Sök endast ut de kolumner som du behöver

Set visitor=objConn.Execute("SELECT DISTINCT userID, username, HomeDateVisited, HomeTimeVisited FROM tblusers_visitors INNER JOIN tblUsers ON tblusers_visitors.HomeVisitorID = tblUsers.userid WHERE HomeUserId="& request("userID") &" ORDER BY ID DESC limit 5")

...och plocka ut värdena i variabler

<%do until visitor.eof
visitor_HomeTimeVisited=visitor("HomeTimeVisited")
visitor_HomeDateVisited=visitor("HomeDateVisited")
visitor_username=visitor("username")
visitor_userID=visitor("userID")

%>
<a href="javascript:popup(<%=visitor_userID%>);"><img border="0" ALT="Information om <%=visitor_username%>" src="/images/icons/info.gif"></a>

<a class="menu" <%=linkmessage%> href="view.asp?userID=<%=visitor_userID%>">
<%
If Len(visitor_username) > 5 Then
    Response.Write Left(visitor_username, 5) & ".."
Else
    Response.Write visitor_username
End If%>
</a> 
&nbsp;<%=visitor_HomeDateVisited%>&nbsp;<%=visitor_HomeTimeVisited%><br /> 
<%visitor.movenext:loop%>

Prova gärna ändringarna var för sig, så att vi vet vad som funkar, om det funkar.

Medlem sedan feb. 20032 027 inlägg
#25

med nya SQL-en: Ingen skillnad

med visitor-loopen: Ingen skillnad

Ser fortfarande
Webbi.. 2005-11-07 2005-11-07
Webbi.. 2005-11-07 2005-11-07
Webbi.. 2005-11-07 2005-11-07
test 2005-11-07 2005-11-07
Webbi.. 2005-11-07 2005-11-07

Medlem sedan dec. 19996 721 inlägg
#26

WebbisNet skrev:

Hur får man förresten
antalKillar=Cint(killar("Antal")/sum("Antal")*100)
antalTjejer=Cint(tjejer("Antal")/sum("Antal")*100)

att funka i MySQL

Nu har jag två olika frågor som jag gärna vill lösa :-)

Om du kör med 3 olika frågor, som du verkar ha gjort i Access (om den kod du visade var riktig), så funkar det precis likadant. Koden du visade är ASP-kod, så den är i princip inte beroende av vad du kör för DBMS.

Med en fråga kan du göra så här:

SELECT COUNT(*) as UserCount,COUNT(CASE WHEN Sex='M' THEN 1 ELSE NULL END) as MaleCount,COUNT(CASE WHEN Sex='F' THEN 1 ELSE NULL END) as FemaleCount FROM tblUsers

och med ett recordset från den frågan

antalKillar=Cint(rs("MaleCount")/rs("UserCount")*100)
antalTjejer=Cint(rs("FemaleCount")/rs("UserCount")*100)

Man kan göra procentberäkningen direkt i SQL:en om man vill, men jag tänkte att det kunde vara trevligt att få ut de exakta antalen. Exemplet gör det möjligt att introducera andra kön också (!). Egentligen räcker det ju att plocka ut antalet för det ena könet.

Medlem sedan dec. 19996 721 inlägg
#27

Lite testkod:

<%do until visitor.eof

for each field in visitor.fields
   Response.Write field.Name & ":" & field.Type & ":" & visitor(field.Name) & "<BR>"
next
visitor_HomeTimeVisited=visitor("HomeTimeVisited")
visitor_HomeDateVisited=visitor("HomeDateVisited")
visitor_username=visitor("username")
visitor_userID=visitor("userID")

%>
<a href="javascript:popup(<%=visitor_userID%>);"><img border="0" ALT="Information om <%=visitor_username%>" src="/images/icons/info.gif"></a>

<a class="menu" <%=linkmessage%> href="view.asp?userID=<%=visitor_userID%>">
<%
If Len(visitor_username) > 5 Then
    Response.Write Left(visitor_username, 5) & ".."
Else
    Response.Write visitor_username
End If%>
</a> 
&nbsp;<%=visitor_HomeDateVisited%>&nbsp;<%=visitor_HomeTimeVisited%><br /> 
<%visitor.movenext:loop%>
Medlem sedan feb. 20032 027 inlägg
#28

Resultat av testkoden

userID:3:1
username:200:Webbisen
HomeDateVisited:133:2005-11-08
HomeTimeVisited:134:
 Webbi..  2005-11-08 
userID:3:1
username:200:Webbisen
HomeDateVisited:133:2005-11-07
HomeTimeVisited:134:2005-11-08
 Webbi..  2005-11-07 2005-11-08
userID:3:1
username:200:Webbisen
HomeDateVisited:133:2005-11-07
HomeTimeVisited:134:2005-11-08
 Webbi..  2005-11-07 2005-11-08
userID:3:1
username:200:Webbisen
HomeDateVisited:133:2005-11-07
HomeTimeVisited:134:2005-11-08
 Webbi..  2005-11-07 2005-11-08
userID:3:1
username:200:Webbisen
HomeDateVisited:133:2005-11-07
HomeTimeVisited:134:2005-11-08
 Webbi..  2005-11-07 2005-11-08
Medlem sedan feb. 20032 027 inlägg
#29

Fick Type mismatch på antalKillar-raden

objConn.Execute("SELECT COUNT(*) as UserCount,COUNT(CASE WHEN Sex='M' THEN 1 ELSE NULL END) as MaleCount,COUNT(CASE WHEN Sex='F' THEN 1 ELSE NULL END) as FemaleCount FROM tblUsers")

antalKillar=Cint(rs("MaleCount")/rs("UserCount")*100)
antalTjejer=Cint(rs("FemaleCount")/rs("UserCount")*100)

Medlem sedan dec. 19996 721 inlägg
#30

Det vore fint om du skapade ett recordset också... ;)

Medlem sedan feb. 20032 027 inlägg
#31

är trött, ska upp kl 05....jobb imorrn

med
set rs=objConn.Execute("SELECT COUNT(*) as UserCount,COUNT(CASE WHEN Sex='M' THEN 1 ELSE NULL END) as MaleCount,COUNT(CASE WHEN Sex='F' THEN 1 ELSE NULL END) as FemaleCount FROM tblUsers")

if rs.eof then
response.write "Inga poster"
else
do until rs.eof
antalKillar=Cint(rs("MaleCount")/rs("UserCount")*100)
antalTjejer=Cint(rs("FemaleCount")/rs("UserCount")*100)
rs.movenext: loop
end if

får jag iaf
Killar: 5 (100%)
Tjejer:

ADODB.Field error '80020009'

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

/stats.asp, line 0

Hoppas vi löser allt imorrn kväll , sov gott så länge emission och tack för kvällens hjälp så försöker vi imorrn kväll

Medlem sedan dec. 19996 721 inlägg
#32

Ett sista försök

Set visitor=objConn.Execute("SELECT DISTINCT userID, username, HomeDateVisited, CAST(HomeTimeVisited as varchar(20)) as HomeTimeVisited FROM tblusers_visitors INNER JOIN tblUsers ON tblusers_visitors.HomeVisitorID = tblUsers.userid WHERE HomeUserId="& request("userID") &" ORDER BY ID DESC limit 5")

Om det fortfarande inte fungerar så rekommenderar jag att du bygger om tabellen så att det bara finns en kolumn (HomeDateTimeVisited?) där du lagrar tidpunkten som en komplett DATETIME, dvs. med både datum och tid.

Medlem sedan feb. 20032 027 inlägg
#33

kan du tänka dig att det var så enkelt som att ändra datatyperna date och time i db till text :-)

Medlem sedan feb. 20032 027 inlägg
#34

WebbisNet skrev:

kan du tänka dig att det var så enkelt som att ändra datatyperna date och time i db till text :-)

Hur ska vi fixa denna del med?
set rs=objConn.Execute("SELECT COUNT(*) as UserCount,COUNT(CASE WHEN Sex='M' THEN 1 ELSE NULL END) as MaleCount,COUNT(CASE WHEN Sex='F' THEN 1 ELSE NULL END) as FemaleCount FROM tblUsers")

if rs.eof then
response.write "Inga poster"
else
do until rs.eof
antalKillar=Cint(rs("MaleCount")/rs("UserCount")*100)
antalTjejer=Cint(rs("FemaleCount")/rs("UserCount")*100)
rs.movenext: loop
end if

får jag iaf
Killar: 5 (100%)
Tjejer:

ADODB.Field error '80020009'

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

/stats.asp, line 0

och sen strular den här funktionen
Function alder(intAlder)
alder = Left(FormatNumber(DateDiff("y", intAlder, Date())/365.2375),4)
End Function

jag får
Type mismatch: 'FormatNumber'
på en sida medan den kan funka på en annan sida

Medlem sedan dec. 19996 721 inlägg
#35

WebbisNet skrev:

kan du tänka dig att det var så enkelt som att ändra datatyperna date och time i db till text :-)

Ja, det kan jag tänka mig. Det var helt klart Time-datatypen som spökade. En DATETIME kan vara lämplig, om du vill göra datumberäkningar direkt i databasen.

WebbisNet skrev:

Hur ska vi fixa denna del med?
set rs=objConn.Execute("SELECT COUNT(*) as UserCount,COUNT(CASE WHEN Sex='M' THEN 1 ELSE NULL END) as MaleCount,COUNT(CASE WHEN Sex='F' THEN 1 ELSE NULL END) as FemaleCount FROM tblUsers")

if rs.eof then
response.write "Inga poster"
else
do until rs.eof
antalKillar=Cint(rs("MaleCount")/rs("UserCount")*100)
antalTjejer=Cint(rs("FemaleCount")/rs("UserCount")*100)
rs.movenext: loop
end if

får jag iaf
Killar: 5 (100%)
Tjejer:

ADODB.Field error '80020009'

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

/stats.asp, line 0

Du behöver ingen loop, eftersom du bara får tillbaka en rad från databasen.

Det verkar som om du försöker hämta värden från rs, efter dessa rader.

Medlem sedan feb. 20032 027 inlägg
#36

emission skrev:

Ja, det kan jag tänka mig. Det var helt klart Time-datatypen som spökade. En DATETIME kan vara lämplig, om du vill göra datumberäkningar direkt i databasen.

Du behöver ingen loop, eftersom du bara får tillbaka en rad från databasen.

Det verkar som om du försöker hämta värden från rs, efter dessa rader.

Fick till statistiken med, hur skriver man en åldersfunktion som passar till alla rs och inte bara vissa som på min sida :-)

den jag har funkade utmärkt i access men inte nu i MySQL

Medlem sedan dec. 19996 721 inlägg
#37

Vad innehåller intAlder? Variabelnamnet indikerar att det är en "int", men det är väl ett datum?

Function alder(fodelsedatum)
    datDatum=cdate(fodelsedatum)
    intAlder= DateDiff("yyyy", datDatum, Date())
    If Date() < DateSerial(Year(Date()), Month(datDatum),Day(datDatum)) Then
        intAlder= intAlder- 1
    End If
    alder= intAlder
End Function
Medlem sedan feb. 20032 027 inlägg
#38

Strular bara på startsidan där jag visar födelsedagar, alla andra funkar med den funktionen

Set bday=objConn.Execute("Select * From tblUsers where persnr="& varDate &" ")
<%=alder(bday("persnr"))%>

Felmeddelande
Microsoft VBScript runtime error '800a005e'

Invalid use of Null: 'cdate'

/include/functions.asp, line 35

Medlem sedan juni 200032 967 inlägg
#39

Då får du undvika att köra funktionen om det är sparat NULL i fältet.

265 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
115 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)