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.
TThe_HulkMedlem sedan juni 20031 837 inlägg 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?
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.
@ndersMedlem sedan juni 200032 967 inläggDISTINCT appliceras på alla fält i listan. * är alltså ingen bra idé. Använd DISTINCT och ange bara de fält du vill ha.
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.
LLarsGMedlem sedan dec. 200012 464 inlägg SELECT id,name
FROM mp_ing
where ingId in
(select ingId
from mp_dishing
WHERE dishId <> " . $dishId . ")
ORDER BY name ASC
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
EemissionMedlem sedan dec. 19996 721 inlägg SELECT id,name
FROM mp_ing
where ingId not in
(select ingId
from mp_dishing
WHERE dishId = " . $dishId . ")
ORDER BY name ASC
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'
LLarsGMedlem sedan dec. 200012 464 inlägg 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?
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
EemissionMedlem sedan dec. 19996 721 inlägg 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
LLarsGMedlem sedan dec. 200012 464 inlägg 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
Perfekt, jag tackar så mycket. Hoppas ni fick en liten utmaning åtminstone, återkommer med fler problem :)