- scooterbabe
- Medlem ●
- International user
- 2005-02-02 16:18
Ohhhh, så har man stött på ett nytt problem som jag tänkte se om det finns någon guru här som vet en lösning på....
Mitt problem är helt enkelt att jag har ett flertal joins med subjoins, där jag vill kontrollera så att samtliga element som ska joinas faktiskt joinas...
Rörigt..? En aning men läs vidare så ska jag försöka förklara bättre.
I en första tabell har jag relationer till alla de ingrediener som ska finnas med i ett recept:
tostipippitest=# select * from opskrifter_content where opskrift = '12345'; id | ingrediens | maengde | enhed | opskrift ----+------------+---------+-------+---------- 8 | i21 | 2 | 5 | 12345 9 | i18 | 7 | 2 | 12345 11 | i24 | | | 12345 4 | i17 | 2 | 5 | 12345 3 | i14 | 1 | 5 | 12345 (5 rows)
Denna tabell joinas mot ingredienstabellen (no shit), men ingredienstabellen innehåller inga ingrediensnamn, utan de ligger i en tredje tabell, relaterade, eftersom det är möjligt att skifta språk. Ingredienstabellen ser ut som följer:
tostipippitest=# select * from opskrifter_ingredienser limit 10 offset 0; betegnelse | meat | id --------------------+------+----- 816839001084287698 | 1 | i8 838518001084287772 | 0 | i9 165359001084287849 | 0 | i10 73998001084287947 | 0 | i11 959431001084287972 | 0 | i12 135860001084976781 | 0 | i14 49740001084976243 | 1 | i13 722896001087299185 | 0 | i18 856819001087300057 | 0 | i19 270134001087300171 | 0 | i20 (10 rows)
Denna tabell joinas sedan som sagt mot en språktabell, med en jobbig sql,och resultatet kan bli som följer:
tostipippitest=# select distinct maengde, enhed, meat, text as betegnelse from opskrifter_content JOIN (select * from opskrifter_ingredienser join (select * from languages where lang = 'DK') AS languages ON betegnelse = relid) AS opskrifter_ingredienser ON opskrifter_content.ingrediens = opskrifter_ingredienser.id where opskrift = '12345'; maengde | enhed | meat | betegnelse ---------+-------+------+---------------------------------- 1 | 5 | 0 | Ananas i tern 2 | 5 | 0 | Kogesalt 2 | 5 | 1 | Hakket oksekød 7 | 2 | 0 | Oksekød (16-18% fedt) | | 0 | Svinetarme kal. 28/32 mm (99008) (5 rows)
Så långt är allt fint.
Men... jag vill här kunna göra en verifiering att jag verkligen får tillbaka samtliga ingredienser som hör till ett recept, vilket det inte är säkert att jag får ifall de inte är översatta...
Byter jag språk till tyska, till exempel, får jag följande resultat:
maengde | enhed | meat | betegnelse ---------+-------+------+------------ 1 | 5 | 0 | Ananas (1 row)
Vad jag vill göra är alltså att ta reda på att det antal ingredienser som returneras är det antal ingredienser som hör till själva ingrediensen. Jag vill göra detta på ett högre steg i SQL-en, eftersom jag vill använda detta resultat (1/0?) för att göra select på.
För att ytterligare skriva på näsan så tänk enl följande:
select * from opskrifter join (här hamnar ingrediensverifieringssql-en som returnerar 1 eller 0 beroende på ifall samtliga ingredienser har en översättning eller inte) as verify on opskriftsid = verify.opskrift WHERE verify.verified = 1:
Typ...
Det här går säkert lösa genom select - case, men möjligen finns det en flagga eller konstruktion som gör detta på ett mer strömlinjeformat sätt...
vh
/.scooter