K@llenMedlem sedan mars 20032 667 inlägg 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?
LarsGMedlem sedan dec. 200012 464 inlägg sql = "select uid, username " & _
" from members " & _
" where uid not in (select uid from ignorelisr " & _
" ignorelist.sekUid = " & userId & ")"
K@llenMedlem sedan mars 20032 667 inlägg hepp, min mysql tycker inte om den sql:en :(
LarsGMedlem sedan dec. 200012 464 inlägg 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 "
K@llenMedlem sedan mars 20032 667 inlägg tack, ska testa...återkommer...
glömde nämna att det var mysql, sorry. :(
K@llenMedlem sedan mars 20032 667 inlägg 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.
LarsGMedlem sedan dec. 200012 464 inlägg 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
K@llenMedlem sedan mars 20032 667 inlägg 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å.
LarsGMedlem sedan dec. 200012 464 inlägg Jag såg inte din or i join-villkoret.
Det verkar suspekt, speciellt då du också har villkoret att f.primUsrId is null och att den även skall vara lika med userId.
Vi får nog backa lite
Vad är det du vill åstadkomma?
Vad innehåller tabellerna?
K@llenMedlem sedan mars 20032 667 inlägg tabell friendlist (friend-/ignorelist)
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
LarsGMedlem sedan dec. 200012 464 inlägg q = " select distinct m.username, m.uid " & _
" from member m left join friendlist f " & _
" on ((m.uid = f.sekUsrId and f.primUsrId = " & userId & _
" ) or (m.uid = f.primUsrId and f.sekUsrId = " & userId & _
" )) and f.ignore = 0 " & _
" where m.blockedUser = 0 " & _
" and m.activeUser = 1 "
" and m.uid <> " & userId & _
" and f.primUsrId is null " & _
" order by m.username "
Vet inte hur det fungerar då jag inte orkar testa.
K@llenMedlem sedan mars 20032 667 inlägg Detta är något kryptiskt, det fungerar inte med din kod. Men med ändringen i den fetmarkerade raden fungerar det.
Har du någon förklaring till det?
q = " select distinct m.username, m.uid " & _
" from member m left join friendlist f " & _
" on ((m.uid = f.sekUsrId and f.primUsrId = " & userId & _
" ) or (m.uid = f.primUsrId and f.sekUsrId = " & userId & _
" )) [b]and f.ignore <> 1[/b] " & _
" where m.blockedUser = 0 " & _
" and m.activeUser = 1 "
" and m.uid <> " & userId & _
" and f.primUsrId is null " & _
" order by m.username "
Du är en sann hjälte LarsG, tack! :D
K@llenMedlem sedan mars 20032 667 inlägg Kom på en sak. Går det på ett enkelt vis sortera alla vännerna först och sedan resterande medlemmar under sedan?
ex:
-- Vänner --
kalle
hobbe
goliat
-- Övriga --
gustav
anders
niklas
lukas
magnus
LarsGMedlem sedan dec. 200012 464 inlägg
Har du någon förklaring till det?
Kanske att du har null och inte 0 som värde?
q = " select distinct m.username, m.uid " & _
" from member m left join friendlist f " & _
" on ((m.uid = f.sekUsrId and f.primUsrId = " & userId & _
" ) or (m.uid = f.primUsrId and f.sekUsrId = " & userId & _
" )) and f.ignore <> 1 " & _
" where m.blockedUser = 0 " & _
" and m.activeUser = 1 "
" and m.uid <> " & userId & _
" and f.primUsrId is null " & _
" order by case when f.primUsrId = " & userId & _
" then 0 else 1 end, m.username "
K@llenMedlem sedan mars 20032 667 inlägg Jag får inte den till att sortera i annan ordning trots din kod. :(
LarsGMedlem sedan dec. 200012 464 inlägg q = " select distinct m.username, m.uid " & _
" from member m left join friendlist f " & _
" on ((m.uid = f.sekUsrId and f.primUsrId = " & userId & _
" ) or (m.uid = f.primUsrId and f.sekUsrId = " & userId & _
" )) and f.ignore <> 1 " & _
" where m.blockedUser = 0 " & _
" and m.activeUser = 1 "
" and m.uid <> " & userId & _
" and f.primUsrId is null " & _
" order by f.friend desc, m.username "
så då?
LarsGMedlem sedan dec. 200012 464 inlägg Hur blir det då? Finns det med medlemmar av båda typerna i ditt urval?
K@llenMedlem sedan mars 20032 667 inlägg Nej, en id-kombination tex 1 och 3 finns bara en gång. och varje rad kan bara ha ett av fälten som true (1).
Nu sorteras de efter username ASC, trots två villkor i order by.
K@llenMedlem sedan mars 20032 667 inlägg Kanske kan man sortera det i loopen?
Då borde man kunna få med rubrikerna också?