webForumDet fria alternativet

problem med distinct

19 svar · 392 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005833 inlägg
#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

Peter SMedlem sedan dec. 20025 483 inlägg
#2

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

VinnarenMedlem 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?

Peter SMedlem 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.

aasahMedlem 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.

VinnarenMedlem 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

Peter SMedlem sedan dec. 20025 483 inlägg
#7

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

aasahMedlem 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?

VinnarenMedlem 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

Peter SMedlem sedan dec. 20025 483 inlägg
#10

Kan de ha samma datum också?

VinnarenMedlem sedan sep. 2005833 inlägg
#11

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

aasahMedlem 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
Peter SMedlem 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
VinnarenMedlem 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."

aasahMedlem 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?

VinnarenMedlem 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

Peter SMedlem 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) :)

Peter SMedlem 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?

aasahMedlem 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.

VinnarenMedlem 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

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