---
title: "Hjälp med nästlad SQL"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/184975-hjälp-med-nästlad-sql"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "colahelge"
published: "2010-10-20T08:20:49.000Z"
updated: "2010-10-20T09:06:02.000Z"
replies: 7
views: 2006
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/184975-hjälp-med-nästlad-sql"
---

# Hjälp med nästlad SQL

## #1 — colahelge, 2010-10-20T08:20Z

Hej!

Har problem med en sql-sats.

```
SELECT * FROM user AS u INNER JOIN user_e AS ue ON u.user_id = ue.user_extended_id WHERE userEmail != '' AND user_id IN(
SELECT boardUser FROM board WHERE boardClub = variabel)
```

mySql är det som används.

De 3 tabellerna:

board
\-----
boardID		primary AI
boardUser	        int(10)
boardClub	        int(10)

1900 rader

user
\-----
userID		primary AI
userEmail	        varchar(100)

55000 rader

user_e
\------
userID		primary
userClub	        int(10)

55000 rader

Problemet är att ovanstående anrop tar ca 1 minut. Än värre är det om jag kör ytterligare en nästling (query1 IN(query2 IN (query3)), då sänker jag hela siten som slutar svara på anrop. 

Så, är det något fel på koden, är det en dålig metod som är seg eller är något annat fel?

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

## #2 — Lasp, 2010-10-20T08:28Z

Om du har ett 1 till 1 förhållande på user och user_e har du nog felet där! Slåihop tabellerna då!

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

## #3 — colahelge, 2010-10-20T08:39Z

Gjorde om sql:en till:

```
SELECT * FROM user WHERE userID IN(
SELECT boardUser FROM board WHERE boardClub = variabel)
```

Problemet kvarstår dock.

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

## #4 — @nders, 2010-10-20T08:48Z

Om du skriver den som en join då?

```
SELECT user.* FROM user 
INNER JOIN boardUser ON user.userId = boardUser.boardUser AND boardClub = variabel
```

Har du primärnycklar / index rätt satta?

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

## #5 — nitro2k01, 2010-10-20T08:59Z

```
SELECT * FROM user AS u 
INNER JOIN user_e AS ue ON u.user_id = ue.user_extended_id 
INNER JOIN board b ON u.user_id = b.boardUser
WHERE userEmail != '' AND b.boardClub = variabel;
```

Du bör nästan alltid undvika IN av prestandaskäl. Prova frågan ovan. Har du för övrigt satt index på alla relevanta kolumner? Alla primärnycklar bör vara indexerade som sådana. User_extended_id bör ha ett normalt index.

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

## #6 — colahelge, 2010-10-20T08:59Z

Fungerade bra att Joina dom istället. Vad som är primärnycklar syns i första inlägget, tror inte något av de fält som används är indexerade.

Så har iaf en lösning, vore bara intressant att veta varför det blir så fel... 
Tack @nders!

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

## #7 — colahelge, 2010-10-20T09:02Z

> **[nitro2k01 skrev:](https://www.webforum.nu/p/1520280)**
>
> Du bör nästan alltid undvika IN av prestandaskäl. Prova frågan ovan.

Ok, då skippar jag det helt, tyckte det bara var smidigt :)

> **[nitro2k01 skrev:](https://www.webforum.nu/p/1520280)**
>
> Har du för övrigt satt index på alla relevanta kolumner? Alla primärnycklar bör vara indexerade som sådana. User_extended_id bör ha ett normalt index.

Den som skapade databasen hade nog inte full koll. Jag har inte heller full koll för att ändra i efterhand, vill inte "ha sönder nåt" :)

Tack för input!

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

## #8 — nitro2k01, 2010-10-20T09:06Z

> **[colahelge skrev:](https://www.webforum.nu/p/1520281)**
>
> Så har iaf en lösning, vore bara intressant att veta varför det blir så fel... 
> Tack @nders!

När du kör originalfrågan sker troligen följande:
1) **SELECT boardUser FROM board WHERE boardClub = variabel** körs och du får tillbaka ett resultat-set på ett par rader. 
2) Varje enskild post i user söks igenom för att se om någon rad matchar resultatet från 1). Hade du använt en join hade databasen kunnat använda genvägar för att göra samma sak snabbare.

Har du riktig otur körs frågan i 1) en gång för varje rad i user.

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/184975-hjälp-med-nästlad-sql
