webForumDet fria alternativet

Hämta senaste ur annan tabell

7 svar · 248 visningar · startad av Vide

VideMedlem sedan dec. 19998 577 inlägg
#1

Jag har en ganska fet SQL-sats som jag vill lägga till en sak i, ur tabellen "Loginlog" vill jag hämta fältet "date", men jag vill hämta det senaste datumet. Det finns en koppling mellan Members.id och Loginlog.uid.

Jag vill alltså hämta det senaste datumet som finns med i kopplingen till användarens id. Har lite svårt att förstå hur det skall göras. ;)

SELECT Members.id AS id, COUNT(Threads.UID) AS Posts, 
    Members.UserName, Members.Email, 
    Members.RegisteredEmail, Members.Password, 
    Members.ShowEmail, Members.City, Members.HomePage, 
    Members.AutoLogin, Members.Signature, Members.Avatar, 
    Members.Active, Members.RegisterDate, Members.UserLevel, 
    COUNT(Loginlog.UID) AS Logins, COUNT(PM.RecieverUID) 
    AS Mottagna_brev, COUNT(PM.SenderUID) 
    AS Skickade_brev
FROM Members INNER JOIN
    Loginlog ON Members.id = Loginlog.UID LEFT OUTER JOIN
    PM ON Members.id = PM.SenderUID LEFT OUTER JOIN
    Threads ON Members.id = Threads.UID
GROUP BY Members.id, Members.UserName, Members.Email, 
    Members.RegisteredEmail, Members.Password, 
    Members.ShowEmail, Members.City, Members.HomePage, 
    Members.AutoLogin, Members.Signature, Members.Avatar, 
    Members.Active, Members.RegisterDate, 
    Members.UserLevel
HAVING (Members.id = 3)

Mvh, Vide

LarsGMedlem sedan dec. 200012 464 inlägg
#2

,max(loginlog.date) as latestDate

Du borde flytta ditt villkor som du har i having till where.

VideMedlem sedan dec. 19998 577 inlägg
#3

Ah, hjärnsläpp igen. ;)

LarsG skrev:

Du borde flytta ditt villkor som du har i having till where.

Varför då? Vad blir skillnaden?

Engine^Medlem sedan dec. 20003 887 inlägg
#4

Det blir väl ingen skillnad vad jag förstår. HAVING används normalt med GROUP BY, men fungerar på samma sätt som WHERE. Om du använder HAVING utan GROUP BY fungerar det på samma sätt som WHERE...

LarsGMedlem sedan dec. 200012 464 inlägg
#5

villkoren i having appliceras efter det att man gjort alla grupperingar och de i where innan grupperingen.

Det som händer är att du grupperar onödigt mycket data med din nuvarande formulering.

VideMedlem sedan dec. 19998 577 inlägg
#6

Aha, där lärde man sig något nytt idag igen, härligt. :D

LarsGMedlem sedan dec. 200012 464 inlägg
#7

Det är möjligt att en DBMS skulle kunna optimera detta och se att just detta villkor kan utföras innan grupperingen men det är inget som man kan förutsätta i allmänhet.

Du kan ju undersöka med set showplan/explain

VideMedlem sedan dec. 19998 577 inlägg
#8

Upptäckte att det blir fel resultat av min SQL-sats. Frågorn "Posts" och "Logins" återger värdet av det dubbla som Logins skall återge. Nu återger "Logins" värdet 82 när det egentligen skall återge 41. Skumt nog återger "Posts" även 82, fast det skall återge 2. Så någon slags relation har uppstått som jag inte kan hitta.

Nuvarande kod:

SELECT Members.id AS id, COUNT(Threads.UID) AS Posts, 
    Members.UserName, Members.Email, 
    Members.RegisteredEmail, Members.Password, 
    Members.ShowEmail, Members.City, Members.HomePage, 
    Members.AutoLogin, Members.Signature, Members.Avatar, 
    Members.Active, Members.RegisterDate, Members.UserLevel, 
    COUNT(Loginlog.UID) AS Logins, COUNT(PM.RecieverUID) 
    AS Mottagna_brev, COUNT(PM.SenderUID) 
    AS Skickade_brev
FROM Members LEFT OUTER JOIN
    PM ON Members.id = PM.SenderUID LEFT OUTER JOIN
    Loginlog ON Members.id = Loginlog.UID LEFT OUTER JOIN
    Threads ON Members.id = Threads.UID
WHERE Members.id = 3
GROUP BY Members.id, Members.UserName, Members.Email, 
    Members.RegisteredEmail, Members.Password, 
    Members.ShowEmail, Members.City, Members.HomePage, 
    Members.AutoLogin, Members.Signature, Members.Avatar, 
    Members.Active, Members.RegisterDate, Members.UserLevel

Mvh, Vide

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