sql = "select members.uid, members.username
from members, ignorelist
where members.uid = ignorelist.uid
and ignorelist.sekUid <> userId"
Tanken är att lista medlemmar som inte finns med i en medlems ignorelista. Problemet blir när tabellen ignorelist inte innehåller några poster, för då fungerar inte joinen. Men då ska ju alla medlemmar listas, hur bör man göra istället?
Om du använder Mysql så säg det för det är väldigt ofta som man måste anpassa sina SQL-frågor på grund av att Mysql saknar mycket basal SQL-funktionalitet.
sql = "select m.uid, m.username " & _
" from members m left join ignorelist i " & _
" on m.uid = i.uid and i.sekuid = " & userid & _
" where i.sekUid is null "
jag lyckas varken med din eller min lite mer utvecklade.
select m.username, m.uid
from member m
left join friendlist f
on ( m.uid = f.primUsrId or m.uid = f.sekUsrId )
where m.pmOn = 1
and m.blockedUser = 0
and m.activeUser = 1
and (( primUsrId = " & userId & " and f.ignored = 0 ) or ( sekUsrId = " & userId & " and f.ignored = 0 ))
and m.uid <> " & userId & "
and f.primUsrId is null
order by m.username
Får inga träffar om tabellen friendlist är tom, får rätt träffar om tabellen innehåller data.
Om du har en outer join så är det meningslöst att ha villkor på f i where-klausulen. Om du har icke matchande poster så fylls kolumnerna i tabellen f med null för dessa poster. Om du då ställer villkor att f.ignored = 0 (dvs att den inte är null) så blir det precis som om du hade använt en vanlig join.
Du får flytta dessa villkor till on
select m.username, m.uid
from member m
left join friendlist f
on ( m.uid = f.primUsrId or m.uid = f.sekUsrId
and f.ignored = 0 and f.primUsrId is null)
where m.pmOn = 1
and m.blockedUser = 0
and m.activeUser = 1
and (( primUsrId = " & userId & " ) or ( sekUsrId = " & userId & " ))
and m.uid <> " & userId & "
order by m.username
nu får jag träffar oavsett om det finns poster eller inte. :D
Problemet nu är att den verkar strunta i "f.ignored = 0", dvs den tar med poster där ignored = 1. Med andra ord så tar den med ignorerade medlemmar också.
listId (räknare)
primUsrId ( primärt uid, vilken användare som gjort valet )
sekUsrId (sekundärt uid, vilken medlem valet gäller )
friend (true/false, 1/0)
ignored (true/false, 1/0)
Bara ett av fälten kan vara true
tabell members (data om medlemmarna)
uid (räknare)
username (medlemsnamn)
pmOn (om medlemmen har pm på eller av)
activeUser och blockedUser (om medlem inte aktiverat konto, eller om medlemskonto är totalt stängt)
Jag vill lista alla medlemmar (medlemsnamn/medlemsid) där kontot är aktivt, pm är på, och där antingen avsändare eller mottagare inte har ignorerat varandra. Kort och gott, en lista på alla medlemmar som en medlem ska kunna sända ett pm till.
Kanske ska säga att jag flyttade ytterligare en rad til on (fetmarkerad)
select m.username, m.uid
from member m
left join friendlist f
on ( m.uid = f.primUsrId or m.uid = f.sekUsrId
and f.ignored = 0 and f.primUsrId is null)
where m.pmOn = 1
and m.blockedUser = 0
and m.activeUser = 1
[b]and (( f.primUsrId = " & userId & " ) or ( f.sekUsrId = " & userId & " ))[/b]
and m.uid <> " & userId & "
order by m.username