Toon posts:

[MySQL] standaardtaal geven als de gevraagde niet bestaat

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een site voor productbeheer. Alle producten komen uit tblproduct. De benamingen komen uit tblproductname

tblproduct = ID, category
tlproductname = ID, product, lang, name

Op de site zelf is er een taalkeuze (NL, FR, EN, DU), dit kunnen er meer worden in de toekomst. Nu kan ik perfect de juiste naam ophalen die hoort bij een product
code:
1
2
SELECT * FROM tblproduct INNER JOIN tblproductname ON tblproduct.ID = tblproductname.product
WHERE tblproduct.ID = 5 ORDER BY tblproductname.name ASC

Het probleem komt er als een bepaalde taal niet voorkomt in de database (de vertaling is nog niet gemaakt). Dan zou hij de standaardtaal moeten laten zien (dit kan gewijzigd worden in een config bestand. Het is dus niet mogelijk om taal 1 als standaard te gebruiken). Als de standaardtaal ook niet bestaat mag hij een taal laten zien die wel zou bestaan. Slechts de naam in geen enkele taal voorkomt mag hij niet getoond worden.

Mogelijke oplossing:

Een query uitvoeren die alle mogelijke talen teruggeeft en die dan gaan sorteren op ID met bovenaan de gewenste taal, dan de standaardtaal, dan de rest (gesorteerd op ID)
Maar ik denk niet dat dit mogelijk is

Een tweede oplossing is een query gaan bouwen die een WHERE doet op de gewenste taal, als die niet bestaat een WHERE doet op de standaardtaal en als die niet bestaat de WHERE gewoon laat vallen. Dan is het resultaat alle overblijvende talen.
In de drie gevallen de query sorteren op ID en een LIMIT 0, 1 doen om enkel de eerst voorkomende taal terug te geven. Als de productnaam in geen enkele taal voorkomt is er geen resultaat en zal het product niet getoond worden

Theoretisch allemaal heel mooi maar ik krijg het niet in een query gegoten. Ik zou het wel met php kunnen opvangen en verschillende query's laten uitvoeren maar dat doe ik liever niet.

Ik heb al geprobeerd om een if structuur in te bouwen die gaat controleren of bepaalde waardes wel bestaan. Maar dat lijkt steeds fout te lopen.
Heb ook iets gevonden als EXIST maar dat doet ook niet helemaal wat het zou moeten doen

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

code:
1
2
3
4
5
6
7
SELECT tblproduct.*, coalesce(naam1.name, naam2.name) AS denaam
FROM tblproduct 
LEFT OUTER JOIN tblproductname naam1 
        ON tblproduct.ID = naam1.product AND naam1.lang = gewensttaaltje
LEFT OUTER JOIN tblproductname naam2 
        ON tblproduct.ID = naam2.product AND naam2.lang = defaulttaaltje
WHERE tblproduct.ID = 5

Vul hierbij bij gewensttaaltje het id van de gewenste taal in en bij defaulttaaltje het id van de taal waarop ie terug moet vallen. COALESCE pakt dan de eerste van de twee eruit die niet NULL is.

[ Voor 30% gewijzigd door Haploid op 29-07-2005 17:03 ]

Hey, I came here to be drugged, electrocuted and probed, not insulted.


Verwijderd

Topicstarter
Dat klopt vrij goed. Alleen heb ik een LEFT JOIN moeten gebruiken. Anders geeft hij altijd een resultaat terug, en dat wil ik niet als er geen vertaling is voor de naam

Het is aangepast zie ik :)

edit:

Je aanpassing geeft hetzelfde probleem lijkt me

[ Voor 24% gewijzigd door Verwijderd op 29-07-2005 17:15 ]


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Verwijderd schreef op vrijdag 29 juli 2005 @ 17:13:
Dat klopt vrij goed. Alleen heb ik een LEFT JOIN moeten gebruiken. Anders geeft hij altijd een resultaat terug, en dat wil ik niet als er geen vertaling is voor de naam

Het is aangepast zie ik :)

edit:
Je aanpassing geeft hetzelfde probleem lijkt me
Ja sorry, eerst was ik vergeten de INNER in LEFT te veranderen, maar gelukkig snap je dat zelf ook al.

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • Gwaihir
  • Registratie: December 2002
  • Niet online
Cool; laat ik nu net datzelfde probleempje nog hebben liggen. ;)

Nou ja, ik zou graag de eerste beschikbare uit een lijst van voorkeurstalen willen pakken, maar ik zie in het manual al dat COALESCE geen bezwaar heeft tegen een lijst langer dan twee opties. :)