webForumDet fria alternativet

Skapa händelseöversikt till community

Databaser & SQL

6 svar · 554 visningar · startad av Grillcliff

Medlem sedan sep. 200032 inlägg
Frågan#1

Skapar nyhetsflöde över händelser på ett community och allt funkar perfekt så när som på en grej. Flödet, som baserar sig på sina vänners händelser ser ut på följande vis:

Användare (M10) svarade i Diskussionstråd #1 (igår 19:53)
Användare 2 (M13) skrev på klotterplanket (igår 19:44)
Användare 3 (F18) uppdaterade sin profil (igår 19:23)

Felet uppkommer när man blir kompis med en annan, eftersom den då listar händelsen typ lika många gånger som man har kompisar. Har jag sju kompisar och jag blir kompis med en annan står det i händeleförloppet:

Användare (F24) blev kompis med användare (idag 12:15)
Användare (F24) blev kompis med användare (idag 12:15)
Användare (F24) blev kompis med användare (idag 12:15)
Användare (F24) blev kompis med användare (idag 12:15)
Användare (F24) blev kompis med användare (idag 12:15)
Användare (F24) blev kompis med användare (idag 12:15)
Användare (F24) blev kompis med användare (idag 12:15)
Användare (F24) blev kompis med användare (idag 12:15)

Antagligen har det att göra med WHERE-satsen, som jag använder för att ta ut vilka vänner hela händelsepresentationen ska basera sig på. Friends-tabellen används två gånger (LEFT OUTER JOIN och i WHERE-satsen) och jag har på känn att det sker något av en kollision där.

SQL = "SELECT f.intUserID as FID, f.intFriendID, u.id, u.strUsername, u.strSex, u.strBirthday, ft.strTopic, a.*, a.intFriend as intKompis, a.intUserID as intID FROM actions a INNER JOIN users u ON u.id = a.intUserID LEFT OUTER JOIN forum_topics ft ON ft.id = a.intThread LEFT OUTER JOIN friends f ON f.intUserID = a.intFriend WHERE a.intUserID IN (SELECT f.intFriendID FROM friends f WHERE f.intUserID = " & Session("userid") & ") ORDER BY a.ID DESC LIMIT 0,20"

Går det att lösa?

Medlem sedan dec. 200012 464 inlägg
#2

Beskriv hur dina tabeller är definierade. Ge exempel på datainnehåll och förväntat resultat.

Medlem sedan sep. 200032 inlägg
#3

actions

som synes två fält
intThread ifall händelsen härrör till ett forumssvar i en tråd
intFriend ifall händelsen härrör till att man blivit kompis med någon

friends

users
har ID, strUsername, strBirthday och strSex m.m.

Lättast är nog att kika här för att förstå hur det ska se ut (bortsett från att den översta posten inte skall finnas med sex-sju gånger alltså):

Medlem sedan sep. 200032 inlägg
#4

Är problemet överskådligt och finns det tillräckligt med information eller måste det kanske delas upp i flera hämtningar? Skulle visning av fulla tabelluppbyggnader hjälpa på traven? :)

Medlem sedan dec. 200012 464 inlägg
#5
SELECT f.intUserID as FID, 
       f.intFriendID, 
       u.id, 
       u.strUsername, 
       u.strSex, 
       u.strBirthday, 
       ft.strTopic, 
       a.*, 
       a.intFriend as intKompis, 
       a.intUserID as intID 
  FROM actions a 
  INNER JOIN users u ON u.id = a.intUserID 
  LEFT OUTER JOIN forum_topics ft ON ft.id = a.intThread 
  LEFT OUTER JOIN friends f ON f.intUserID = a.intFriend 
   and f.intFriendID = a.intuserID
 WHERE a.intUserID IN 
     (SELECT f.intFriendID 
        FROM friends f 
       WHERE f.intUserID = " & Session("userid") & ") 
 ORDER BY a.ID 
 DESC LIMIT 0,20
Medlem sedan dec. 200012 464 inlägg
#6

Du kommer att få problem dock, om en person har gjort flera inlägg och blivit kompis med flera. Egentligen så skulle du dela det i två frågor som du tar unionen av.

Medlem sedan sep. 200032 inlägg
#7

Tack så mycket för hjälpen! Nästa projekt blir att kolla på hur UNION används. Vet dock på ett ungefär hur det funkar :)

267 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)