---
title: "två tabeller"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/71193-två-tabeller"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "K@llen"
published: "2003-03-15T22:39:23.000Z"
updated: "2003-03-24T11:39:39.000Z"
replies: 19
views: 344
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/71193-två-tabeller"
---

# två tabeller

## #1 — K@llen, 2003-03-15T22:39Z

```
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?

Permalänk: https://www.webforum.nu/p/71193

## #2 — LarsG, 2003-03-16T14:23Z

```
sql = "select uid, username " & _
         "  from members " & _
         " where uid not in (select uid from ignorelisr " & _
         "  ignorelist.sekUid = " & userId & ")"
```

Permalänk: https://www.webforum.nu/p/981738

## #3 — K@llen, 2003-03-16T14:29Z

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

Permalänk: https://www.webforum.nu/p/981744

## #4 — LarsG, 2003-03-16T14:38Z

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 "
```

Permalänk: https://www.webforum.nu/p/981746

## #5 — K@llen, 2003-03-17T18:58Z

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

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

Permalänk: https://www.webforum.nu/p/982614

## #6 — K@llen, 2003-03-17T19:47Z

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.

Permalänk: https://www.webforum.nu/p/982654

## #7 — LarsG, 2003-03-17T20:16Z

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

Permalänk: https://www.webforum.nu/p/982676

## #8 — K@llen, 2003-03-17T20:36Z

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å.

Permalänk: https://www.webforum.nu/p/982685

## #9 — LarsG, 2003-03-17T20:47Z

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?

Permalänk: https://www.webforum.nu/p/982698

## #10 — K@llen, 2003-03-17T20:56Z

**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
```

Permalänk: https://www.webforum.nu/p/982709

## #11 — LarsG, 2003-03-18T18:47Z

```
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.

Permalänk: https://www.webforum.nu/p/983322

## #12 — K@llen, 2003-03-18T19:45Z

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

Permalänk: https://www.webforum.nu/p/983355

## #13 — K@llen, 2003-03-23T17:29Z

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

Permalänk: https://www.webforum.nu/p/986372

## #14 — LarsG, 2003-03-23T18:29Z

> 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 "
```

Permalänk: https://www.webforum.nu/p/986426

## #15 — K@llen, 2003-03-23T20:59Z

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

Permalänk: https://www.webforum.nu/p/986530

## #16 — LarsG, 2003-03-23T21:40Z

```
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å?

Permalänk: https://www.webforum.nu/p/986564

## #17 — K@llen, 2003-03-23T21:49Z

Nä, inte nu heller.  :(

Permalänk: https://www.webforum.nu/p/986569

## #18 — LarsG, 2003-03-24T09:29Z

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

Permalänk: https://www.webforum.nu/p/989628

## #19 — K@llen, 2003-03-24T10:18Z

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.

Permalänk: https://www.webforum.nu/p/989645

## #20 — K@llen, 2003-03-24T11:39Z

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

Permalänk: https://www.webforum.nu/p/989692

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/71193-två-tabeller
