---
title: "Hur skriver jag för att slippa dubletter?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/160007-hur-skriver-jag-för-att-slippa-dubletter"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Helmertz"
published: "2007-05-07T03:15:46.000Z"
updated: "2007-05-08T16:42:52.000Z"
replies: 13
views: 874
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/160007-hur-skriver-jag-för-att-slippa-dubletter"
---

# Hur skriver jag för att slippa dubletter?

## #1 — Helmertz, 2007-05-07T03:15Z

Min SQL-sats som skriver ut rätt värden, men jag vill ha bort dubletterna:

```php
SELECT * FROM mp_ing INNER JOIN mp_dishing ON mp_ing.ingId = mp_dishing.ingId WHERE mp_dishing.dishId != '".$dishId."' ORDER BY mp_ing.name ASC
```

Exempeldata:

```
[U]mp_ing[/U]            [u]mp_dishing[/u]
ingId     name        dishId     ingId
    1      ost             1       1
    2 tomatsås             1       2
                           2       1
                           3       1
```

I exemplet ger SQL-satsen två svar vid sökning av ingId = 1 (ingId 1 förekommer två ggr) men jag vill bara ha ut ett exemplar.

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

## #2 — The_Hulk, 2007-05-07T07:18Z

DISTINCT kanske hjälper dig.

```php
SELECT DISTINCT * FROM mp_ing INNER JOIN mp_dishing ON mp_ing.ingId = mp_dishing.ingId WHERE mp_dishing.dishId != '".$dishId."' ORDER BY mp_ing.name ASC
```

du skrev att vid sökning av ingId = 1 så fick du två träffar.
Du har ingen parameter i ditt WHERE-uttryck som heter ingId, däremot har du dishId.
Var det bara en felskrivning eller menade du något annat?

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

## #3 — Helmertz, 2007-05-07T12:04Z

DISTINCT gjorde ingen skillnad.

Tanken med != dishId är att man endast ska lista de ingredienser som inte redan ingår i maträtten. Jag vill alltså ha ut alla (inga dubletter) ingId från mp_dishing som inte har det dishId som variabeln innehåller.

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

## #4 — @nders, 2007-05-07T12:06Z

DISTINCT appliceras på alla fält i listan. \* är alltså ingen bra idé. Använd DISTINCT och ange bara de fält du vill ha.

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

## #5 — Helmertz, 2007-05-07T15:30Z

Jag bröt ut de två fält jag vill ha resultat av (dishId och name) för att ange dem DISTINCT:a. Det resulterade i 0 resultat, testat både mot phpMyAdmin med blandade värden och genom det riktiga PHP-scriptet.

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

## #6 — LarsG, 2007-05-07T16:14Z

```
 SELECT id,name
   FROM mp_ing 
 where ingId in 
    (select ingId 
        from mp_dishing
     WHERE dishId <> " . $dishId . ") 
 ORDER BY name ASC
```

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

## #7 — Helmertz, 2007-05-07T21:38Z

Ditt exempel fungerade inte heller, LarsG. Så här ser koden ut nu, när jag inte längre får ut några resultat alls:

```php
function printMod($cartDishId){
	# Print form för adding/deleting ingredients to a given dish
	$modSql = "SELECT * FROM mp_cart WHERE cartDishId = '".$cartDishId."' LIMIT 1";
	$modQuery = mysql_query($modSql);
	while($mod = mysql_fetch_array($modQuery)){
		$dishId = $mod['dishId'];

		$plusIngSql = "SELECT ingId, name FROM mp_ing WHERE ingId IN (SELECT ingId FROM mp_dishing WHERE dishId <> ".$dishId.") ORDER BY name ASC";
		$plusIngQuery = mysql_query($plusIngSql);
		echo'
		<form action="'.$_SERVER['PHP_SELF'].'" method="post">
		<input type="hidden" value="'.$cartDishId.'" name="cartDishId" />
		<p><label for="plusIng">Lägg till ingrediens</label>
		<select name="plusIng" id="plusIng">
		<option value="0">Ingen ändring</option>';
		while($plusIng = mysql_fetch_array($plusIngQuery)){
			echo'
			<option value="'.$plusIng['ingId'].'">'.ucwords($plusIng['name']).'</option>';
		}
		echo'
		</select>
		</p>';

		$minusIngSql = "SELECT ingId, name FROM mp_ing WHERE ingId IN (SELECT ingId FROM mp_dishing WHERE dishId = ".$dishId.") ORDER BY name ASC";
		$minusIngQuery = mysql_query($minusIngSql);
		echo'
		<p><label for="minusIng">Ta bort ingrediens</label>
		<select name="minusIng" id="minusIng">
		<option value="0">Ingen ändring</option>';
		while($minusIng = mysql_fetch_array($minusIngQuery)){
			echo'
			<option value="'.$minusIng['ingId'].'">'.$minusIng['name'].'</option>';
		}
		echo'
		</select>
		</p>

		<p><input type="submit" value="Spara ändringar" name="saveMod" /></p>
		</form>
		';
	}
}
```

Jag ändrade från ditt id till ingId i SELECT. Är det fel i något annat än i SQL? Databasen är av typen MySQL, desvärre vet jag inte vilken version. Ifall vetskapen om vilken version det är krävs för att nå en lösning kanske du kan tipsa om en lämplig SQL-sats.

mvh

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

## #8 — emission, 2007-05-07T23:19Z

```
SELECT id,name
   FROM mp_ing 
 where ingId not in 
    (select ingId 
        from mp_dishing
     WHERE dishId = " . $dishId . ") 
 ORDER BY name ASC
```

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

## #9 — Helmertz, 2007-05-08T15:17Z

Tyvärr fel igen. Saxat från phpMyAdmin:

```
SELECT ingId, name
FROM mp_ing
WHERE ingId NOT
IN (

SELECT ingId
FROM mp_dishing
WHERE dishId = '1'
)
ORDER BY name ASC
LIMIT 0 , 30

MySQL sa: Dokumentation
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select ingId
        from mp_dishing
     WHERE dishId = '1'
```

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

## #10 — LarsG, 2007-05-08T15:42Z

Du har ju en urgammal version av Mysql.

Vilket resultat förväntar du dig, givet det datainnehåll du angett i första posten?

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

## #11 — Helmertz, 2007-05-08T15:54Z

OBS: nytt exempel
När dishId är 2 vill jag få ut 2 och 3.
När dishId är 1 vill jag få ut 2.
När dishId är 3 vill jag få ut 1 (i bara ett ex) och 3.

```
[B]mp_ing[/B]                [B]mp_dishing[/B]
[I]ingId     name        dishId     ingId[/I]
    1      ost             1       1
    2 tomatsås             1       3
                           2       1
                           3       2
```

Jag vill alltså ha en version av alla olika ingId som inte finns med dishId:t jag anger

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

## #12 — emission, 2007-05-08T16:13Z

```
SELECT i.id,i.name
FROM mp_ing i
LEFT JOIN mp_dishing d ON d.dishId = " . $dishId . " AND i.ingId=d.ingId
WHERE d.dishId IS NULL
GROUP BY i.id,i.name
ORDER BY i.name ASC
```

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

## #13 — LarsG, 2007-05-08T16:22Z

```
select mp_ing.ingid,name from mp_ing
  left join mp_dishing 
  on mp_ing.ingid = mp_dishing.ingId
  and mp_dishing.dishid = 3 
  where mp_dishing.ingId is null
```

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

## #14 — Helmertz, 2007-05-08T16:42Z

Perfekt, jag tackar så mycket. Hoppas ni fick en liten utmaning åtminstone, återkommer med fler problem :)

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/160007-hur-skriver-jag-för-att-slippa-dubletter
