Avatar billede madeindk Nybegynder
29. maj 2007 - 14:44 Der er 9 kommentarer og
1 løsning

Hjælp til SELECT i MySQL

Hej eksperter! Jeg sidder i øjeblikket og roder lidt med et vennesystem på mit site, og nu kunne jeg godt tænke mig at hive ud hvornår brugeren sidst har været logget ind, det kan jeg også sagtens gøre via en ny SQL sætning, men nu kunne jeg godt tænke mig at vide om det kan gøres i selve SQL sætningen.

Lige nu ser det sådan her ud:
SQL = "SELECT a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate FROM users_friends a INNER JOIN users b ON a.friendID = b.ID WHERE a.userID=" & strID & " AND a.status = 2 ORDER BY b.online DESC LIMIT " & intStart & ", " & intPageSize & ""

Det funger også fint, men hvordan hiver jeg brugerens seneste login ud sammen med det? Tabellen hedder 'users_loginfo' og skal joine på b.ID = users_loginfo.userID (hvis det kan laves i en JOIN sætning) - det håber jeg det kan, det vil gøre det meget hurtigere at hive ud. I skal dog lige være opmærksom på at en bruger jo godt kan ha' logget ind flere gange, så den skal hive den nyeste ud for hver bruger.
Avatar billede fennec Nybegynder
29. maj 2007 - 14:49 #1
Brug en max() og group by

SQL = "SELECT a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate, max(c.dato) "&_
    "FROM users_friends a INNER JOIN users b ON a.friendID = b.ID "&_
    "LEFT JOIN users_loginfo c on b.ID = c.userID "&_
    "WHERE a.userID=" & strID & " AND a.status = 2 "&_
    "GROUP BY a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate "
    "ORDER BY b.online DESC LIMIT " & intStart & ", " & intPageSize & ""
Avatar billede fennec Nybegynder
29. maj 2007 - 14:50 #2
Manglede lige en &_

SQL = "SELECT a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate, max(c.dato) "&_
    "FROM users_friends a INNER JOIN users b ON a.friendID = b.ID "&_
    "LEFT JOIN users_loginfo c on b.ID = c.userID "&_
    "WHERE a.userID=" & strID & " AND a.status = 2 "&_
    "GROUP BY a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate "&_
    "ORDER BY b.online DESC LIMIT " & intStart & ", " & intPageSize & ""
Avatar billede madeindk Nybegynder
29. maj 2007 - 15:00 #3
Jeg ændret lidt i den og nu ser den sådan her ud:

        SQL = "SELECT a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate, MAX(c.loginTime), MAX(c.loginDate) "&_
        "FROM users_friends a INNER JOIN users b ON a.friendID = b.ID "&_
        "LEFT JOIN users_loginfo c on b.ID = c.userID "&_
        "WHERE a.userID=" & strID & " AND a.status = 2 "&_
        "GROUP BY a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate "&_
        "ORDER BY b.online DESC LIMIT " & intStart & ", " & intPageSize & ""

Og nu siger den:
Item cannot be found in the collection corresponding to the requested name or ordinal.

På en linie hvor jeg hiver loginTime og loginDate ud.
Avatar billede madeindk Nybegynder
29. maj 2007 - 15:02 #4
Nu virker det - skulle bare sætte AS på :)

        SQL = "SELECT a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate, MAX(c.loginTime) as loginTime, MAX(c.loginDate) as loginDate "&_
        "FROM users_friends a INNER JOIN users b ON a.friendID = b.ID "&_
        "LEFT JOIN users_loginfo c on b.ID = c.userID "&_
        "WHERE a.userID=" & strID & " AND a.status = 2 "&_
        "GROUP BY a.id, a.friendID, b.username, b.online, b.kon, b.birthday, picture_add, picture_validate "&_
        "ORDER BY b.online DESC LIMIT " & intStart & ", " & intPageSize & ""

Men den sorterer forkert. Det er ikke brugerens seneste login der bliver hevet ud og det tager en krig for den. Kan det hænge sammen med der er 35000 poster i users_loginfo? Og skal det laves på en anden måde?
Avatar billede 0xffff Nybegynder
29. maj 2007 - 15:09 #5
er der nogen speciel grund til at du bruger left join istedet for inner join?

Som jeg forstår på dig vil du kun have information om de personer som har været logget ind ikke ?

Hvis du laver left join på users_loginfo vil den forsøge at matche hver af dine userid med alle de 35000 poster i din loginfo.

Det kan eventuelt være der din query har problemer med hastigheden.
Avatar billede madeindk Nybegynder
29. maj 2007 - 15:10 #6
Nej. Du har misforstået, jeg lister alle en brugers venner - henter brugerens brugernavn, fødselsdag etc., og samtidig vil jeg gerne ha' at den skal hente brugerens seneste login ud.
Avatar billede fennec Nybegynder
29. maj 2007 - 15:15 #7
0xffff >>
Hastighedsmæssig er der ikke stor forskeld på Left og inner join. Forskellen ligger kun i at NULL værdier bliver ignoreret på match betingelsen.

.o) <-- One Eyed Jack
Avatar billede madeindk Nybegynder
29. maj 2007 - 15:17 #8
Ja, det er rigtigt. Men fennec det virker jo ikke nu, den sorterer jo forkert og det tager en krig - så spørger jeg, er det fordi der ligger 35000 poster i tabellen?
Avatar billede madeindk Nybegynder
29. maj 2007 - 15:30 #9
Fandt anden og hurtigere metode. Nu skriver jeg bare det direkte ind i user tabellen :) Men ellers tak for hjælpen fennec - du får point.
Avatar billede fennec Nybegynder
29. maj 2007 - 15:46 #10
Er også bedst at skrive det direkte ind i usertabellen.

Bare af nysgerighed, hvilken datatype er loginTime og loginDate?
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
Kurser inden for grundlæggende programmering

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