Avatar billede madd Nybegynder
19. april 2006 - 21:51 Der er 5 kommentarer

Problemer med JOINs og clause

Hej,

Grundet overforbrug af koffein tænker jeg vist ikke længere klart - det er der forhåbentlig én af jer der gør.

Sagen er den, at jeg i en tabel - drink_drink - har en række drinks. I en anden tabel har jeg relationsdata til nogle ingredienser. Denne tabel hedder drink_ingredient_relation.

Tabellerne er opbygget som følger (unødvendige felter skåret fra):

drink_drink
-----------------------
drink_id
drink_name

drink_ingredient_relation
-----------------------
drink_id (henviser til hvilken drink denne relation gælder for)
ingredient_id (henviser til id'et på ingrediensen)
ingredient_essential (henviser til om ingrediensen er 100% nødvendig for at lave drinken)

Jeg har nu en website hvorpå man skal kunne afkrydse hvilke ingredienser man har i sit barskab og herefter skal systemet vise de drinks, hvor alle dens rækker i drink_ingredient_relation med ingredient_essential er lig 1.

Eksempel:

Søger efter drinks hvor ingredienserne 1, 4 og 5 indgår som eneste ingredienser i drinken. Her skal også drinks hvor f.eks. kun 1 eller 1 og 4 findes.

Hvordan grejer jeg den?

En løsning jeg har forsøgt er at lave en GROUP BY drink_id - men da jeg ikke kan bruge GROUP_CONCAT() kan jeg ikke finde ud af hvilke ingredienser der er nødvendige til drinken.

/mattias
Avatar billede horsmark Nybegynder
19. april 2006 - 22:02 #1
måske noget ala dette ?

select * from
drink_drink
left join
drink_ingredient_relation As t2
on
  drink_drink.drink_id = t2.drink_id AND
  t2.ingredient_essential = 1
Avatar billede horsmark Nybegynder
19. april 2006 - 22:03 #2
Hov relationstabellen skal lige med

select * from
drink_drink,
drink_ingredient_relation
left join
drink_ingredient_relation As t2
on
  drink_drink.drink_id = t2.drink_id AND
  t2.ingredient_essential = 1
Avatar billede madd Nybegynder
19. april 2006 - 22:13 #3
Hej,

Ja-  lidt i den retning har jeg også været. Jeg har fået løst problemet med følgende SQL-sætning:

SELECT
    drink_drink.drink_id,
    drink_ingredient_relation,
    COUNT(DISTINCT r2.ingredient_id) AS count_drink_ingredients,
    COUNT(DISTINCT drink_ingredient_relation.ingredient_id) AS count_search_ingredients
FROM
    drink_ingredient_relation
LEFT JOIN
    drink_drink
ON
    drink_drink.drink_id = drink_ingredient_relation.drink_id
LEFT JOIN
    drink_ingredient_relation AS r2
ON
    r2.drink_id = drink_drink.drink_id AND
    r2.ingredient_essential = 1
WHERE
    drink_ingredient_relation.ingredient_id = 1 OR
    drink_ingredient_relation.ingredient_id = 4
GROUP BY
    r2.drink_id
HAVING
    count_drink_ingredients <= count_search_ingredients

Hvor de ingredienser jeg søger efter puttes i WHERE-sætningen. Hvis det ønskes kan HAVING-delen omformuleres således at den også henter drinks ud hvor der kun mangler én ingrediens.
Avatar billede horsmark Nybegynder
19. april 2006 - 22:17 #4
følgende er at foretrække:

...
WHERE
    drink_ingredient_relation.ingredient_id IN (1,4)
...
Avatar billede horsmark Nybegynder
19. april 2006 - 22:17 #5
men super du fik det løst ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester