Verifiera joins (postgresQL)

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1

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

Vad ska hända om en ingrediens inte är översatt?

Kan du skillnaderna mellan JOIN, LEFT JOIN, RIGHT JOIN, INNER JOIN och OUTER JOIN?

Jo, det vet jag. Men hur hjälper det mig här?

Frågan är egentligen om det är vettigast att göra detta med SQL. Jag skulle säkerställa att en ingrediens blir översatt till samtliga språk vid inmatning. Om det av någon anledning inte skulle fungera så skulle standardspråket användas, förslagsvis engelska.

Alla recept finns inte på danska, och alla recept finns inte på engelska. Det är totalt godtyckligt, och inte heller kan en ingrediens då den upprättas översättas till samtliga språk, av ett flertal anledningar.

Vad jag måste veta är om samtliga ingredienser som det länkas till ett recept är översatta, och inte bara ett fåtal.

Åter till fråga 1 då mao; Vad ska hända om en ingrediens inte är översatt?

Om en ingrediens inte är översatt, d v s om antalet returnerade ingredienser är, exempelvis, 4 istället för 5, så vill jag returnera 0, annars 1, eller något i den stilen.

Vad jag vill ha ut av det är att när jag listar från huvudtabellen så ska inte de recept där en eller flera ingredienser inte är översatta reurneras.

Nu kanske detta låter virrigt efter en kväll på macpubben...

  • Medlem
  • Stockholm
  • 2005-02-04 13:31

Kan du inte bara räkna hur många ingredienser ett recept har och räkna hur många du får tillbaks ?? Alternativt göra en dubbelnegering, kontrollera att det INTE är så att en ingrediens finns i receptet som INTE finns bland de översatta ingredienserna. Har fått lära mig att det är det vanligaste sättet att lösa "har relation till alla"-problem.

Jo, nu är vi ev på rätt spår. Grejen jag vill göra är att använda detta som en subquery när jag listar samtliga recept, d v s om inte samtliga existerande returneras, så ska inte heller receptets namn och nummer returneras...

1
Bevaka tråden