Avatar billede fixxxer Nybegynder
05. september 2004 - 00:43 Der er 4 kommentarer og
1 løsning

join men få stadig "grund"-data med

Jeg har i spm http://eksperten.dk/spm/535503 søgt efter noget hjælp til at konstruere en SQL-sætning af svær grad og har selv kommet frem til noget der er meget tæt på et fungerende bud.

Problemet ligger i at ved JOIN på [tracking]-tabellen, er det ikke sikkert at der er nogle rows, dvs at rows fra [A.threads] tabellen der ikke har en "partner" heri, bliver ikke udskrevet.

Håber det giver mening... :-)

Her er mit foreløbige SQL:

SELECT A.threadID, A.threadParent, A.threadForum, A.threadGroup, A.threadTitle, A.threadUser,
A.threadDateTime, MAX(B.threadDateTime) AS MaxOfDate, C.trackStamp,
IF(MAX(B.threadDateTime) > C.trackStamp, 1, 0) AS trackOld
FROM threads A
LEFT JOIN threads B ON B.threadParent = A.threadID
RIGHT JOIN tracking C ON C.trackThread = A.threadID
WHERE C.trackThread = A.threadID AND C.trackUser = 'navn'
GROUP BY A.threadGroup ORDER BY trackOld DESC, MaxOfDate DESC, A.threadDateTime ASC

som det fremgår skal [threads]-tabellen joine sig selv for at finde childrens via threadParent feltet, og samtidigt skal vi finde ud af om brugeren til netop denne threadID er i tracking-tabellen.

Og som nævnt er problemet, at findes de ikke her kommer rækkerne ikke med i udtrækket, men det vil jeg gerne have de gør alligvel!

Sub-selects er pt ikke en mulighed, og vil kun forsøge denne vej hvis det er et must.
Avatar billede fixxxer Nybegynder
05. september 2004 - 00:44 #1
det skal siges at jeg ikke har særlig godt styr på RIGHT/LEFT/INNER/OUTER joins, så bær over med mig hvis jeg har lavet en fejl i den del :-)
Avatar billede fixxxer Nybegynder
05. september 2004 - 01:16 #2
Nu synes jeg nu alligvel at finde en guldåre:

SELECT A.threadID, A.threadParent, A.threadForum, A.threadGroup, A.threadTitle, A.threadUser,
A.threadDateTime, MAX(B.threadDateTime) AS MaxOfDate, C.trackStamp,
IF(MAX(B.threadDateTime) > C.trackStamp, 1, 0) AS trackOld
FROM threads A
LEFT JOIN threads B ON B.threadParent = A.threadID
LEFT JOIN tracking C ON C.trackThread = A.threadID AND C.trackUser = 'Jonas'
GROUP BY A.threadGroup ORDER BY trackOld DESC, MaxOfDate DESC, A.threadDateTime ASC


Det virker tilsyneladende præcis som det skal, men med hånden på hjertet har jeg leget med lidt frem til et resultat.

Er der nogen der har lyst til at udbybe/forbedre?
Avatar billede arne_v Ekspert
11. september 2004 - 15:38 #3
Der er vist ikke meget at forbedre, sådan laves en left join.
Avatar billede fixxxer Nybegynder
11. september 2004 - 16:55 #4
ok tak, det er jo rart hvis man kan lære lidt :-)

vil du have nogen point?
Avatar billede arne_v Ekspert
11. september 2004 - 17:06 #5
Jeg har ikke bidraget med noget
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