webForumDet fria alternativet

Hur skriver jag för att slippa dubletter?

Databaser & SQL

13 svar · 820 visningar · startad av Helmertz

Medlem sedan maj 2005353 inlägg
Frågan#1

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

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.

Medlem sedan juni 20031 837 inlägg
#2

DISTINCT kanske hjälper dig.

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?

Medlem sedan maj 2005353 inlägg
#3

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.

Medlem sedan juni 200032 967 inlägg
#4

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.

Medlem sedan maj 2005353 inlägg
#5

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.

Medlem sedan dec. 200012 464 inlägg
#6
 SELECT id,name
   FROM mp_ing 
 where ingId in 
    (select ingId 
        from mp_dishing
     WHERE dishId <> " . $dishId . ") 
 ORDER BY name ASC
Medlem sedan maj 2005353 inlägg
#7

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:

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

Medlem sedan dec. 19996 721 inlägg
#8
SELECT id,name
   FROM mp_ing 
 where ingId not in 
    (select ingId 
        from mp_dishing
     WHERE dishId = " . $dishId . ") 
 ORDER BY name ASC
Medlem sedan maj 2005353 inlägg
#9

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'
Medlem sedan dec. 200012 464 inlägg
#10

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?

Medlem sedan maj 2005353 inlägg
#11

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

Medlem sedan dec. 19996 721 inlägg
#12
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
Medlem sedan dec. 200012 464 inlägg
#13
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
Medlem sedan maj 2005353 inlägg
#14

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

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)