---
title: "välj ut de som saknas"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/82473-välj-ut-de-som-saknas"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "The_Hulk"
published: "2003-07-22T12:53:31.000Z"
updated: "2003-07-22T14:29:28.000Z"
replies: 6
views: 247
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/82473-välj-ut-de-som-saknas"
---

# välj ut de som saknas

## #1 — The_Hulk, 2003-07-22T12:53Z

Låt oss säga att vi har tabellerna

```
tbl_alla
(
 id int,
 namn varchar(32)
);

tbl_anvandare
(
 id int,
 namn varchar(32)
);

tbl_valda
(
 id int,
 vald_id int,
 anv_id int
);
```

med värdena

```
--- tbl_alla ---
id | namn
-----------------------------------
 1 | 'testar'
 2 | 'att'
 3 | 'välja'
 4 | 'ej'
 5 | 'valda'
-----------------------------------

--- tbl_anvandare ---
id | namn
-----------------------------------
 1 | 'foo'
 2 | 'bar'
-----------------------------------

--- tbl_valda ---
id | vald_id | anv_id 
-----------------------------------
 1 |       1 | 1
 2 |       2 | 2
 3 |       3 | 1
-----------------------------------
```

nu vill jag ha en SQL-fråga som väljer ut de poster som användare 'foo' INTE har valt.

för att välja de som han valt skriver man ju:

```
SELECT
    a.id,
    a.namn

FROM
    tbl_alla AS a,
    tbl_valda AS v

WHERE
    v.anv_id = 1 AND
    a.id = v.vald_id
```

då bör man få

```
id | namn
-----------------------------------
 1 | 'testar'
 3 | 'välja'
-----------------------------------
```

men jag vill ha

```
id | namn
-----------------------------------
 2 | 'att'
 4 | 'ej'
 5 | 'valda'
-----------------------------------
```

OBS! jag kör mot mySQL 3.23.54

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

## #2 — The_Hulk, 2003-07-22T13:29Z

Min nödlösning blev att jag först får välja ut de ID från tbl_valda som tillhör 'foo' därefter välja ut all från tbl_alla förutom de som matchar de jag först hämtade ut.

hade det varit SQL-server eller Oracle så hade det varit lätt att göra detta i en SQL-fråga men MINUS/EXCLUDE eller subqueries stöds inte av MySQL än.

Men jag skulle vara väldigt tacksam om någon annan kunde komma på en bättre lösning än denna.

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

## #3 — Pace, 2003-07-22T13:49Z

Ehh, känns som om du behöver se över din databasdesign istället för sql-frågorna. Vad betyder en tabell som heter "alla" och en som heter "valda"? Du behöver inte förklara för mig, men "tänk efter före". ;)

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

## #4 — LarsG, 2003-07-22T14:00Z

```
SELECT a.id,    a.namn
  FROM tbl_alla AS a left join tbl_valda AS v 
      ON a.a.id = v.vald_id
    AND v.anv_id = 1
 WHERE v.vald_id is null
```

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

## #5 — The_Hulk, 2003-07-22T14:10Z

> **Pace skrev:**
>
> Ehh, känns som om du behöver se över din databasdesign istället för sql-frågorna. Vad betyder en tabell som heter "alla" och en som heter "valda"? Du behöver inte förklara för mig, men "tänk efter före". ;)

Min databas ser inte ut så. Var bara ett exempel jag gjorde för att förklara vad jag menade.

tbl_alla skulle bara symbolisera en tabell där det fanns många poster och en användare kunde välja några av dem.

tbl_valde är alltså en kopplingstabell för att användaren ska kunna välja några ur tbl_alla

Det är väl inget konstigt med det? Sen vad de heter har ju absolut ingen betydelse för upplägget av databasen. Så länge man själv vet vad allting är så gör det inget. Självklart är det bra med förklarande namn om man vill att andra lätt ska kunna sätta sig in i det.

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

## #6 — The_Hulk, 2003-07-22T14:17Z

> **LarsG skrev:**
>
> ```
> SELECT a.id,    a.namn
>   FROM tbl_alla AS a left join tbl_valda AS v 
>       ON a.a.id = v.vald_id
>     AND v.anv_id = 1
>  WHERE v.vald_id is null
> ```

tack så jätte mycket, det fugnerade om jag ändrade 
ON a.a.id = v.vald_id
till
ON a.id = v.vald_id

misstänker att det blev ett skrivfel

tack ännu en gång

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

## #7 — Pace, 2003-07-22T14:29Z

> **The_Hulk skrev:**
>
> Min databas ser inte ut så. Var bara ett exempel jag gjorde för att förklara vad jag menade. 
> 
> tbl_alla skulle bara symbolisera en tabell där det fanns många poster och en användare kunde välja några av dem. 
> 
> tbl_valde är alltså en kopplingstabell för att användaren ska kunna välja några ur tbl_alla

Okej! :)

> **The_Hulk skrev:**
>
> Sen vad de heter har ju absolut ingen betydelse för upplägget av databasen. Så länge man själv vet vad allting är så gör det inget. Självklart är det bra med förklarande namn om man vill att andra lätt ska kunna sätta sig in i det.

Så länge du är helt själv och sysslar med databasen kontinuerligt, ja. Men varför göra det sämsta av situationen? Om du skulle låta databasen vila i sex månader och därefter komma tillbaka för att administrera den så lovar jag dig att du har svårt att över huvud taget begripa vad tabellerna "alla", "valda", "ejvalda", "inskickade" och allt vad de heter innebär. Jag har själv gjort de misstagen, fast då gäller det inte databaser. ;)

Att göra en bra design från grunden underlättar inte bara framtida administration, det är lättare för andra att sätta sig in i det och det blir dessutom lättare att integrera med andra system.

Ta inte detta som något klagomål utan som ett tips. Den enda som blir lidande för en dålig design är ju du själv. :)

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/82473-välj-ut-de-som-saknas
