Använder mig av en MySQL server och följande fråga för att summera pricet på valda produketers ID Det beror på att den helt enkelt bara tar ut en etta, alltså blir din SQL sats samma som Borde inte det gå med en join? Så vid IN (1,2...) får det bara vara unika värden? Alltså, det är inte det att det är unika värden i IN(...) som är problemet. Nått liknande denna kan du ju skriva också: En loop lär man ju behöva ändå när man ska generera frågan, men man slipper loopade sql-anrop. Jag har känslan av att MySQL fixar det snabbar med UNION istället för flera subselect.SQL frågan summerar inte dubbleter
<code>SELECT SUM(price) FROM prod WHERE id IN (1,1,2,3)</code>
Fungerar fint men, som sakt den summerar inte dubbletterna.
Några ideér?
Tack i förhand! :)Sv: SQL frågan summerar inte dubbleter
<code>
SELECT SUM(price) FROM prod WHERE id IN (1,2,3)
</code>
Du måste se till att du får unika rader vid frågan.
Antar att du vill summera totalpriset för ett antal produkter, men du måste göra detta på annat sätt i detta fall.Sv:SQL frågan summerar inte dubbleter
Släng in grejerna i en annan tabell, gör join på dem med ursprungliga och ta sum() på dem då.Sv:SQL frågan summerar inte dubbleter
Körde en while loop innan för att räkna ihop, men det var kanske inte så effektivt. Kan också säga att kör i språket PHP.
Om nu vara unika värden kan finnas i IN(...) hur kan man då lösa det på ett effektivare sätt?
Min kod kanske också hjälper?
<code>
//Exempel...
//$vProd = array(1, 1, 2, 3, 4);
//
$sql = "SELECT SUM(price) AS summa FROM prod WHERE id IN (".implode(', ', $vProd).")";
$r = mysql_fetch_assoc($result);
$summa = $r['summa'];
</code>Sv: SQL frågan summerar inte dubbleter
Tänk dig att du har en lista:
1
2
3
4
5
6
7
8
Och så anropar du
SELECT * FROM x WHERE id IN (1, 2, 3);
Det som händer då är ju i princip att sin SQL-server letar igenom listan, kollar om varje rad passar uppfyller villkoren, och - i så fall - lägger till den i sin retur. Raderna som matchar är 1, 2, och 3.
Om du istället gör anropet
SELECT * FROM x WHERE id IN (1, 1, 1, 1, 1, 2, 3);
Så kommer fortfarande raderna 1, 2, och 3 att matcha.
Alltså får du antingen välja varje för sig som du gör, eller så att säga välja "åt andra hållet". Alltså att du utgår från din lista med 1, 1, ..., och sen väljer ut de raderna som passar in på det i din ursprungliga tabell.
Dvs något i stil med:
INSERT INTO temp(id) VALUES (1);
INSERT INTO temp(id) VALUES (1);
INSERT INTO temp(id) VALUES (2);
INSERT INTO temp(id) VALUES (3);
(Vilket du lämpligtvis gör i en loop.)
Och sen något i stil med:
SELECT SUM(price) FROM (prod NATURAL JOIN temp);Sv:SQL frågan summerar inte dubbleter
<code>
select
(SELECT SUM(job_ID) from Employee where job_ID=13) +
(SELECT SUM(job_ID) from Employee where job_ID=14) +
(SELECT SUM(job_ID) from Employee where job_ID=14)
</code>
eller
<code>
select
SUM(
CASE
WHEN job_ID=13 THEN job_id
ELSE 0
END
)
+
SUM(
CASE
WHEN job_ID=14 THEN job_id
ELSE 0
END
)
+
SUM(
CASE
WHEN job_ID=14 THEN job_id
ELSE 0
END
)
from Employee
</code>
Du slipper då loopar och temp-tabeller. Men jag ingen aning om om det blir effektivare.. ;)
Mvh
PeterSv: SQL frågan summerar inte dubbleter
Sv: SQL frågan summerar inte dubbleter
SELECT SUM(price) AS summa FROM (
SELECT price FROM prod WHERE id =1
UNION ALL SELECT price FROM prod WHERE id =1
UNION ALL SELECT price FROM prod WHERE id =1
UNION ALL SELECT price FROM prod WHERE id =2
UNION ALL SELECT price FROM prod WHERE id =3)
/Johan