webForumDet fria alternativet

problem med distinct

Databaser & SQLur Databashanterare & SQL

19 svar · 392 visningar · startad av Vinnaren

Medlem sedan sep. 2005833 inlägg
Frågan#1

Har följande:

SELECT p.PrId, p.Name, p.ShortDescription, pr.Price
FROM producttocamp AS ptc

INNER JOIN product AS p
ON ptc.PrId = p.PrId

INNER JOIN price AS pr
ON pr.PrId = p.PrId

WHERE ptc.CampId = @CampId
ORDER BY pr.StartDate DESC

Som koden är nu hämtas samma produkt flera gånger, jag vill bara visa den en gång. Har provat med Distinct på p.PrId men blev ingen skillnad.

Hur löser man detta? :stud

Medlem sedan dec. 20025 483 inlägg
#2

Vid flera träffar på samma id - vilken post vill du då ha?

Medlem sedan sep. 2005833 inlägg
#3

jag vill ha ut flera poster, men jag vill inte ha ut samma produkt så många gånger det finns ett pris för den. Tex finns det det 5 pris för en produkt så kommer den ut 5 gånger.

Så vill jag inte ha det.

Hur löser man det?

Medlem sedan dec. 20025 483 inlägg
#4

Men av dessa fem produkter - vilken vill du ha ut? Jag gissar att priset har en viss betydelse eftersom det är ett av fälten du väljer ut i SELECT.

Medlem sedan mars 20034 471 inlägg
#5

Om jag förstår dig rätt vill du ha ut de 5 priserna men produkt bara en gång?

Det går inte. Inte via SQL-satsen i varje fall. Det får du i så fall fixa via applikationen. Eller genom två separata SQL-frågor. En som tar ut produktens namn och en som tar fram resten.

Medlem sedan sep. 2005833 inlägg
#6

ok, jag vill bara ha ut produkten en gång med ett pris. nu får jag ut produkten flera gånger med olika pris

tex

1 - Test - 100
1 - Test - 500
2 - Test2 - 100

Jag vill bara ha ut Test en gång

Medlem sedan dec. 20025 483 inlägg
#7

Kan samma pris förekomma i någon av posterna för 1?

Medlem sedan mars 20034 471 inlägg
#8

OK, men VILKET av prisen vill du ha ut? Det spelar väl en viss roll om du får ut Pris 100 eller 500 ovan?

Medlem sedan sep. 2005833 inlägg
#9

jag vill ha ut det senast inlagda priset dvs ORDER BY pr.StartDate DESC

Japp, 1 kan ha
1 - Test - 100 - 2007-10-10
1 - Test - 500 - 2007-12-12
1 - Test - 100 - 2008-01-01

Medlem sedan dec. 20025 483 inlägg
#10

Kan de ha samma datum också?

Medlem sedan sep. 2005833 inlägg
#11

hmm, svår fråga, ja det kan vara samma, men det är inte troligt

Medlem sedan mars 20034 471 inlägg
#12

Hmmm... Testa:

SELECT p.PrId, p.Name, p.ShortDescription, pr.Price
FROM producttocamp AS ptc
INNER JOIN product AS p ON ptc.PrId = p.PrId
INNER JOIN price AS pr ON pr.PrId = p.PrId
WHERE ptc.CampId = @CampId 
GROUP BY p.PrId
HAVING pr.StartDate = 
   (SELECT MAX(pr.StartDate) FROM price C WHERE C.PrId = p.PrId)
ORDER BY pr.StartDate DESC
Medlem sedan dec. 20025 483 inlägg
#13
SELECT distinct p.PrId, p.Name, p.ShortDescription, pr.Price
FROM producttocamp AS ptc
INNER JOIN product AS p
ON ptc.PrId = p.PrId
INNER JOIN price AS pr
ON pr.PrId = p.PrId
WHERE ptc.CampId = @CampId 
and pr.StartDate = 
 ( select max(startdate) from price
   where prid = p.prid )
ORDER BY pr.StartDate DESC
Medlem sedan sep. 2005833 inlägg
#14

aasah skrev:

Hmmm... Testa:

SELECT p.PrId, p.Name, p.ShortDescription, pr.Price
FROM producttocamp AS ptc
INNER JOIN product AS p ON ptc.PrId = p.PrId
INNER JOIN price AS pr ON pr.PrId = p.PrId
WHERE ptc.CampId = @CampId 
GROUP BY p.PrId
HAVING pr.StartDate = 
   (SELECT MAX(pr.StartDate) FROM price C WHERE C.PrId = p.PrId)
ORDER BY pr.StartDate DESC

Tack, men får felmeddelandet
"Column 'price.StartDate' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause."

Medlem sedan mars 20034 471 inlägg
#15

Prova Peters då.

Varken ditt eller mitt förslag funkar väl om ett prid, får två pris samma datum, Peter_S?

Medlem sedan sep. 2005833 inlägg
#16

Peter S skrev:

SELECT distinct p.PrId, p.Name, p.ShortDescription, pr.Price
FROM producttocamp AS ptc
INNER JOIN product AS p
ON ptc.PrId = p.PrId
INNER JOIN price AS pr
ON pr.PrId = p.PrId
WHERE ptc.CampId = @CampId 
and pr.StartDate = 
 ( select max(startdate) from price
   where prid = p.prid )
ORDER BY pr.StartDate DESC

Tusentack för all hjälp, nu funkar den (y) :i

Fungerar dock inte om det är samma datum, men skit samma, får ha någon kolla så det inte kan vara det i databasen

Medlem sedan dec. 20025 483 inlägg
#17

aasah skrev:

Prova Peters då.

Varken ditt eller mitt förslag funkar väl om ett prid, får två pris samma datum, Peter_S?

I.o.m. att jag lade till DISTINCT slipper vi eventuella dubbletter (såvida inte produkterna skiljer sig vad gäller namn eller beskrivning) :)

Medlem sedan dec. 20025 483 inlägg
#18

Vinnaren skrev:

Tusentack för all hjälp, nu funkar den (y) :i

Fungerar dock inte om det är samma datum, men skit samma, får ha någon kolla så det inte kan vara det i databasen

Så poster med samma id och datum kan ha olika namn eller beskrivning?

Medlem sedan mars 20034 471 inlägg
#19

Vinnaren skrev:

Fungerar dock inte om det är samma datum, men skit samma, får ha någon kolla så det inte kan vara det i databasen

Byt ut datum mot datetime så är du i hamn. Att det skulle bli samma borde vara omöjligt.

Medlem sedan sep. 2005833 inlägg
#20

aasah skrev:

Byt ut datum mot datetime så är du i hamn. Att det skulle bli samma borde vara omöjligt.

Tack för tipset :bire

133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)