webForumDet fria alternativet

två tabeller

19 svar · 341 visningar · startad av K@llen

K@llenMedlem sedan mars 20032 667 inlägg
#1
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
#2
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
#3

hepp, min mysql tycker inte om den sql:en :(

LarsGMedlem sedan dec. 200012 464 inlägg
#4

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
#5

tack, ska testa...återkommer...

glömde nämna att det var mysql, sorry. :(

K@llenMedlem sedan mars 20032 667 inlägg
#6

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

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
#8

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
#9

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
#10

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
#11
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
#12

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
#13

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
#14

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
#15

Jag får inte den till att sortera i annan ordning trots din kod. :(

LarsGMedlem sedan dec. 200012 464 inlägg
#16
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å?

K@llenMedlem sedan mars 20032 667 inlägg
#17

Nä, inte nu heller. :(

LarsGMedlem sedan dec. 200012 464 inlägg
#18

Hur blir det då? Finns det med medlemmar av båda typerna i ditt urval?

K@llenMedlem sedan mars 20032 667 inlägg
#19

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
#20

Kanske kan man sortera det i loopen?
Då borde man kunna få med rubrikerna också?

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)