webForumDet fria alternativet

Få ut flera värden

Databaser & SQL

13 svar · 418 visningar · startad av DavidB

Medlem sedan jan. 20001 372 inlägg
Frågan#1

Hej

Har fått ett litet problem med en SQL fråga som jag inte lyckats få att fungera riktigt som jag vill.

Mina tabeller serut ungefär såhär:
attribut_varden
- id

prod_av
- id
- av_id <- innehåller värden från attribut_varden.id
- p_id <- innehåller värden från produkter.id

produkter
- id

Jag har ett obestämt antal attribut_varden.id. Med hjälp av dessa vill jag få ut de produkter som har alla dessa attribut kopplade till sig.

Jag har hittils kommit såhär långt:

SELECT produkter.id
FROM produkter,prod_av
WHERE produkter.id = prod_av.p_id
AND prod_av.av_id = 14

Såhär långt får jag det att fungera och alla produkter som är kopplade till alla attribut_varden.id listas upp.

Jag vill ju dock kunna plocka ut produkter efter fler attribut så jag testade att lägga till en extra rad:

SELECT produkter.id
FROM produkter,prod_av
WHERE produkter.id = prod_av.p_id
AND prod_av.av_id = 10
AND prod_av.av_id = 14

Nu är det så att jag inte får ut några produkter överhuvudtaget. Är det någon som ser hur jag kan göra för att få det att fungera?

Medlem sedan dec. 20025 483 inlägg
#2

Detta är en motsägelse:

AND prod_av.av_id = 10
AND prod_av.av_id = 14

Testa istället:

SELECT produkter.id
FROM produkter,prod_av
WHERE produkter.id = prod_av.p_id 
AND (
    prod_av.av_id = 10 OR 
    prod_av.av_id = 14
);

:)

Medlem sedan juni 200032 967 inlägg
#3

Ja, en post kan ju inte ha av_id = 10 och av_id = 14 samtidigt? Byt AND till OR och gruppera de villkoren med en parentes.

Edit: annars kan ju villkoret av_id IN (10, 14) göra susen.

Medlem sedan jan. 20001 372 inlägg
#4

@nders skrev:

Ja, en post kan ju inte ha av_id = 10 och av_id = 14 samtidigt?

Jo, det är precis det jag vill att den skall göra :)

Säg att mina tabeller med värden ser ut såhär:
attribut_varden
| id |
1
2
3

prod_av
| id | av_id | p_id |
1 | 1 | 1
2 | 2 | 1
3 | 3 | 1

4 | 1 | 2
5 | 2 | 2

6 | 1 | 3
6 | 3 | 3

produkter
| id |
1
2
3

och jag kör följande kod:

AND prod_av.av_id = 1
AND prod_av.av_id = 3

så är det meningen att jag skall få ut produkterna 1 och 3.

kör jag följande kod:

AND prod_av.av_id = 1
AND prod_av.av_id = 2

så skall jag få ut produkterna 1 och 2.

Kör jag däremot denna:

AND prod_av.av_id = 1
[b]OR[/b] prod_av.av_id = 3

så bör jag ju få ut alla tre poster i produkter?

Medlem sedan juni 200032 967 inlägg
#5

Kan du berätta för mig hur en och samma post kan ha både det exakta värdet 10 och det exakta värdet 14 i ett fält?

Medlem sedan jan. 20001 372 inlägg
#6

Njae, det var ju lite därför jag frågade här ;)

Grejen är ju den att i attribut_varden är det ju 2 eller flera olika poster som kopplas ihop med en post i produkter genom tabellen prod_av. Det känns som om det borde kunna fås att fungera.

Jag får väl inse att det inte går men kanske det finns nåt annat sätt man kan göra på?

Medlem sedan dec. 200012 464 inlägg
#7
SELECT produkter.id
FROM produkter,prod_av
WHERE produkter.id = prod_av.p_id
AND prod_av.av_id in (10,14)
group by produkter.id
having count(*) = 2
Medlem sedan aug. 2001676 inlägg
#8

Jag har ett liknande problem med blev inte hjälpt av den här lösningen.

Jag har en tabell där grundinformation om en produkt är lagrad.
ProdID, produktnamn osv

Sedan finns det tillbehör i en annan tabell som är lagrad på följande sätt:
TillbehorID, tillbehor, ProdID

Jag vill sedan ha en sql sats som plockar ut alla produkter som har vissa tillbehör. Det går bra så länge det är ett tillbehör men när man väljer flera som MÅSTE finnas med blir det problem.

Jag har testat med IN() men då visas ju produkten även om den bara har ett av tillbehören.

Testade också med två st in: IN(3) or .... IN(4) men det gick inte alls.

Vad kan man använda om man vill att två eller flera tillbehör ska finnas med?

Mvh Lena

Medlem sedan juni 200032 967 inlägg
#9

Jag hade nog joinat in tillbehörstabellen två gånger.

Medlem sedan aug. 2001676 inlägg
#10

@nders skrev:

Jag hade nog joinat in tillbehörstabellen två gånger.

Hur då tänkte du?

Det jag har är en MySQL databas.

Joinen ser ut så här idag:

...from produkter as p inner join tillbehor as t on t.prodid=p.prodid...

Jag försökte också med det här:

IN(select t1.ProdID from tillbehor t1, tillbehor t2 where t1.TillbehorID <> t2.TillbehorID and t1.ProdID=t2.ProdID and (t1.TillbehorID=4 or t1.TillbehorID=6) and (t2.TillbehorID=4 or t2.TillbehorID =6))

men det verkar inte funka i MySQL:
"Check the manual that corresponds to your MySQL server version for the right syntax..."

Mvh Lena

Medlem sedan aug. 2001676 inlägg
#11

Ingen som har någon idè?
:OO

Medlem sedan dec. 200012 464 inlägg
#12

Varför kan du inte använda en variant av den fråga som jag skrev?

Medlem sedan aug. 2001676 inlägg
#13

LarsG skrev:

Varför kan du inte använda en variant av den fråga som jag skrev?

Om bara ett av de två (eller ännu fler) valda tillbehören finns till produkten så ska produkten INTE visas. Detta hände när jag testade med en variant av Din kod. Jag vill att endast de produkter som har samtliga valda tillbehör ska visas.

Mvh Lena

Medlem sedan dec. 200012 464 inlägg
#14

Jag vill att endast de produkter som har samtliga valda tillbehör ska visas.

Det är så min fråga fungerar.

Hur ser din fråga ut?

Hur ser dina tabeller ut?

273 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)