webForumDet fria alternativet
Logga in / Bli medlem

Hämta senaste ur annan tabell

Databaser & SQL

7 svar · 248 visningar · startad av Vide

Medlem sedan dec. 19998 577 inlägg
Trådstart#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

Medlem sedan dec. 200012 464 inlägg
#2

,max(loginlog.date) as latestDate

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

Medlem 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?

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...

Medlem 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.

Medlem sedan dec. 19998 577 inlägg
#6

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

Medlem 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

Medlem 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

256 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)