webForumDet fria alternativet

Hämta alla fält på villkor att ett fält är unikt

Databaser & SQL

9 svar · 419 visningar · startad av web00132

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

Konstig rubrik kanske, och jag ber om ursäkt om jag är en dålig sökare men jag har verkligen inte hittat nåt och jag tror mitt problem är jäkligt lätt om man vet hur man gör. Min SQL-sats ser ut så här för tillfället:

SELECT
	produkt.produktnamn,
	produkt.produktID,
	produkt.pris,
	produkt.bild,
	produkt.beskrivning,
	produkt.produktgruppID

FROM
	produkt,
	produktamnen

WHERE
	produkt.lager > 0  AND 
	produkt.produktgruppID = 4 AND 
	produktamnen.amneID = 1 AND 
	produktamnen.produktID = produkt.produktID

ORDER BY
	produkt.produktnamn,
	produkt.produktID
	DESC;

Nu vill jag köra precis den här satsen och hämta fram alla de här fälten men på villkor att fältet 'produktnamn' är DISTINCT. Hur göra? Har testat nästlade SELECT-satser och GROUP BY mm men jag får inte till det. :(

Medlem sedan dec. 200012 464 inlägg
#2
and not exists
(select * 
    from produkt p
  where p.produktnamn = produkt.produktnamn
     and p.produktid <> produkt.produktid)
Medlem sedan maj 2001797 inlägg
#3

Tack för svaret! :)
Men vad är det du gör, vad är 'p' för nåt? Jag får inget felmeddelande men inga fält plockas fram, tyvärr. Glömde säga att jag kör MS Access.

Medlem sedan dec. 200012 464 inlägg
#4

p är ett godtyckligt namn som används för att skilja de olika instanserna av produkttabellen.
Att du använder Access skall inte innebära något för den frågan. Kan du visa hela frågan?

Medlem sedan maj 2001797 inlägg
#5
SELECT
produkt.produktnamn,
produkt.produktID,
produkt.pris,
produkt.bild,
produkt.beskrivning,
produkt.produktgruppID

FROM
produkt,
produktIDinnehallgruppID

WHERE
produkt.lager > 0 AND
produkt.produktgruppID = 4 AND 
produktIDinnehallgruppID.produktinnehallgruppID = 1 AND 
produktIDinnehallgruppID.produktID = produkt.produktID AND NOT EXISTS
(SELECT *
    FROM produkt p
  WHERE p.produktnamn = produkt.produktnamn
     AND p.produktid <> produkt.produktid)

ORDER BY
produkt.produktnamn,
produkt.produktID
DESC;

Det här är dom riktiga fältnamnen, det är inte jag som byggt databasen, den ser bedrövlig ut. Normalisering är på g, men vi tar en sak i taget. ;)

Medlem sedan dec. 200012 464 inlägg
#6

Ser OK ut. Nu har jag förutsatt att produktid är unikt.

kan du testa följande fråga

select produktnamn,count(*) from produkt group by produktnamn having count(*) = 1

?

Medlem sedan maj 2001797 inlägg
#7

Ledsen att det tagit tid att svara, jag var tvungen att resa bort ett par dagar.
När jag kör ovanstående SQL-sats får jag fram alla mina produktnamn unika samt en post till som heter 'Expr1001' som består av ettor, så här:

produktnamn		Expr1001

produktnamn1		1
produktnamn2		1
produktnamn3		1
osv...

Hur klämmer man in de andra fälten också?

Medlem sedan dec. 200012 464 inlägg
#8

Det där var för att testa att det finns produktnamn som är unika.

Alltså, det finns produktnamn som är unika men inga som uppfyller resten av de villkor som du anger.

SELECT
produkt.produktnamn
FROM
produkt,
produktIDinnehallgruppID

WHERE
produkt.lager > 0 AND
produkt.produktgruppID = 4 AND 
produktIDinnehallgruppID.produktinnehallgruppID = 1 AND 
produktIDinnehallgruppID.produktID = produkt.produktID 
group by produkt.produktnamn 
having count(*) = 1

borde inte returnera något.

Medlem sedan maj 2001797 inlägg
#9

Den satsen returnerar inget nej. Men jag reviderar det jag skrev senast, produkterna i databasen ser ut så här:

produkt1
produkt1
produkt1
produkt2
produkt3
produkt3
produkt3
produkt3
produkt4

De produkter som hämtas fram av den här satsen:

select produktnamn,count(*) from produkt group by produktnamn having count(*) = 1

...är följande produkter:

produkt2
produkt4

Den verkar alltså helt utesluta de produkter det finns fler än en av. Låter det rimligt? Jag är ganska förvirrad måste jag tillstå, och hänger inte riktigt med på hur HAVING och EXISTS fungerar :r

Medlem sedan maj 2001797 inlägg
#10

Ja, det undgår mitt förstånd hur jag ska göra. Jag försöker spalta upp mitt problem en gång till för att klargöra. Jag har två tabeller som ser ut ungefär så här:

[B]produkt[/B]
produktID	produktnamn	lager	produktgruppID	farg
1		t-shirt1	3	4		blå
2		t-shirt1	5	4		röd
3		t-shirt2	15	4		blå
4		bok1		2	1
5		DVD1		12	7
...osv...

[B]produktIDinnehallgruppID[/B]
produktID	produktinnehallgruppID
1		16
1		12
2		9
2		14
2		15
2		12
3		5
3		1
3		14
...osv...

Det jag vill få fram är alltså ett resultat där t ex ...

produkt.produktgruppID = 4 AND
produktIDinnehallgruppID.produktinnehallgruppID = 1 AND 
produkt.lager > 0

...men på villkor att produkt.produktnamn är unikt och produktID är unikt. produkt.produktID är alltså PRIMARY KEY men produktIDinnehallgruppID.produktID är inte unikt i tabellen. Hur göra?

Tack på förhand!

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