Avatar billede axkris Nybegynder
25. marts 2004 - 13:23 Der er 18 kommentarer og
1 løsning

Optimering af sql-kode

Hej

Det virker, men det er meget langsomt afviklet, så mit håb er, en vil optimere min kode for mig:

    '## Forum_SQL - Find brugernes antal af indlæg
    strSql = "SELECT MEMBER_ID FROM " & strTablePrefix & "MEMBERS"
    set rs = my_Conn.execute(strSQL)

    while not rs.eof
        strSql = "SELECT COUNT(R_AUTHOR) as counter FROM " & strTablePrefix & "REPLY WHERE R_AUTHOR = " & RS("MEMBER_ID")
        set rs2 = my_Conn.execute(strSQL)
       
        strSql = "UPDATE " & strTablePrefix & "MEMBERS SET M_POSTS = " & RS2("COUNTER") & " WHERE MEMBER_ID = " & RS("MEMBER_ID")
        my_Conn.execute(strSQL)   
    wend

Jeg anvender mysql 3.
Avatar billede axkris Nybegynder
25. marts 2004 - 13:25 #1
Hov, manglede lige at paste "rs.movenext" ind.
Avatar billede styless Nybegynder
25. marts 2004 - 13:27 #2
Jeg ved ikke rigtig hvordan jeg skulle kunne optimerer den men jeg kan give dig et link til joins: http://www.w3schools.com/sql/sql_join.asp måske denne kunne gøre din kode lettere?
Avatar billede axkris Nybegynder
25. marts 2004 - 13:29 #3
Kan du ikke joine skidtet for mig :)
Avatar billede lap Nybegynder
25. marts 2004 - 13:33 #4
update members a set m_posts = (select count(r_author) from reply where r_author = a.member_id)

Burde give en samlet opdatering - husk at teste

alternativt samler du bare de 2 første til en select:

select member_id,count(r_author) antal from members,reply where member_id=r_author;
Avatar billede lap Nybegynder
25. marts 2004 - 13:33 #5
ups - antal skal rettes til counter
Avatar billede styless Nybegynder
25. marts 2004 - 13:39 #6
axkris > Desværre jeg her ikke så godt check på dem. Ellers ville jeg gerne.
Avatar billede axkris Nybegynder
25. marts 2004 - 13:48 #7
>> Lap
Forslag 1:

UPDATE FORUM_MEMBERS A SET M_POSTS = (SELECT COUNT(R_AUTHOR) FROM FORUM_REPLY WHERE R_AUTHOR = A.MEMBER_ID)

Microsoft OLE DB Provider for ODBC Drivers (0x80040E09)
[TCX][MyODBC]You have an error in your SQL syntax near 'A SET M_POSTS = (SELECT COUNT(R_AUTHOR) FROM FORUM_REPLY WHERE R_AUTHOR = A.MEMB' at line 1

(Jeg anvender mysql 3, hvis det har noget at sige her).

Forslag 2: Har ikke prøvet endnu.
Avatar billede lap Nybegynder
25. marts 2004 - 13:49 #8
jeg kender ikke noget til mysql - jeg skriver (forhåbentlig) sql92 standard :-) Fejlen der dukker op skyldes alias for members - prøv:

UPDATE FORUM_MEMBERS SET M_POSTS = (SELECT COUNT(R_AUTHOR) FROM FORUM_REPLY WHERE R_AUTHOR = members.MEMBER_ID)
Avatar billede axkris Nybegynder
25. marts 2004 - 14:00 #9
Microsoft OLE DB Provider for ODBC Drivers (0x80040E09)
[TCX][MyODBC]You have an error in your SQL syntax near 'SELECT COUNT(R_AUTHOR) FROM FORUM_REPLY WHERE R_AUTHOR = FORUM_MEMBERS.MEMBER_ID' at line 1

UPDATE FORUM_MEMBERS SET M_POSTS = (SELECT COUNT(R_AUTHOR) FROM FORUM_REPLY WHERE R_AUTHOR = FORUM_MEMBERS.MEMBER_ID)
Avatar billede axkris Nybegynder
25. marts 2004 - 14:00 #10
Jeg tror slet ikke, at min mysql kan køre med subselects.
Avatar billede lap Nybegynder
25. marts 2004 - 14:01 #11
glem mit forslag - det kan tydeligvis ikke bruges på mysql3
Avatar billede lap Nybegynder
25. marts 2004 - 14:02 #12
du kan godt bruge mit forslag 2, hvor du samler de 2 første select's til 1.
Avatar billede axkris Nybegynder
25. marts 2004 - 14:25 #13
Forslag 2 virker, det optimerer bare ikke koden så meget... takker for hjælpen :-D Tryk svar

<%
strSQL = "SELECT COUNT(R_AUTHOR) as counter FROM " & strTablePrefix & "REPLY, " & strTablePrefix & "MEMBERS WHERE R_AUTHOR = MEMBER_ID"
set rs = my_Conn.execute(strSQL)

while not rs.eof
    strSQL = "UPDATE " & strTablePrefix & "MEMBERS SET M_POSTS = " & rs("counter")
    my_Conn.execute(strSQL)
    rs.movenext
wend
%>
Avatar billede axkris Nybegynder
25. marts 2004 - 15:19 #14
Hov, den indsætter det forkerte antal i brugerens profil. Den burde optælle hvor mange indlæg den enkelte bruger har, men i stedet optæller den samtlige indlæg.

Hjælp! :)
Avatar billede axkris Nybegynder
25. marts 2004 - 15:31 #15
Ups, en pinlig fejl i update - rettet til:

strSQL = "SELECT MEMBER_ID, COUNT(R_AUTHOR) as counter FROM " & strTablePrefix & "REPLY, " & strTablePrefix & "MEMBERS WHERE MEMBER_ID = R_AUTHOR"
set rs = my_Conn.execute(strSQL)

while not rs.eof
    strSQL = "UPDATE " & strTablePrefix & "MEMBERS SET M_POSTS = " & rs("counter") & " WHERE MEMBER_ID = " & RS("MEMBER_ID")
    my_Conn.execute(strSQL)
    rs.movenext
wend

Men nu siger den blot:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[TCX][MyODBC]Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause
Avatar billede lap Nybegynder
25. marts 2004 - 19:40 #16
Ja, der mangler en group by:

SELECT MEMBER_ID, COUNT(R_AUTHOR) as counter
FROM " & strTablePrefix & "REPLY, " & strTablePrefix & "MEMBERS
WHERE MEMBER_ID = R_AUTHOR
GROUP BY MEMBER_ID
Avatar billede axkris Nybegynder
26. marts 2004 - 13:05 #17
Takker
Avatar billede axkris Nybegynder
26. marts 2004 - 13:08 #18
Men hvad gør group by helt præcist?
Avatar billede detox Nybegynder
26. marts 2004 - 14:00 #19
GROUP BY = Gruppér efter
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester