Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] De preferred value ophalen

Pagina: 1
Acties:

  • iznogood
  • Registratie: September 2001
  • Niet online
Ik ben bezig met het maken van een translation table en ik wil hieruit de vertaalde waarde ophalen, en indien deze niet beschikbaar is de niet-vertaalde waarde.

De table translation ziet er als volgt uit:
id, lang_code, lang_tag, lang_translation

De query zou het volgende moeten doen:
SELECT * FROM translation WHERE (lang_code='de pagina langcode' OR lang_code='de default langcode') AND (lang_tag="vertaaltag1" OR lang_tag="vertaaltag2")

Wanneer de lang_code='de pagina langcode' moet deze waarde opgehaald worden, wanneer deze niet beschikbaar is zal de row opgehaald moeten worden van langcode='de default langcode'.

Hoe kan ik de query zo bouwen dat in plaats van een OR statement de 'pagina langcode' gepreferreerd wordt boven de 'default langcode' en wanneer de 'pagina langcode' aanwezig is alleen deze wordt teruggegeven en zo niet alleen de 'default langcode' wordt teruggegeven?

Just as Good


  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 02:47

  • iznogood
  • Registratie: September 2001
  • Niet online
Bedankt voor je reactie, ik kom op het volgende:
SELECT * FROM tpl_translations_page WHERE lang_code='default_language' AND (lang_phrase="bla" OR lang_phrase="bla") AND NOT EXISTS
(SELECT * FROM tpl_translations_page WHERE lang_code='preferred_language' AND (lang_phrase="bla" OR lang_phrase="bla"))

Hier voer ik dus in het ergste geval 2x een query uit. Hoe is dit met een join op te lossen, en is dit ook een beter methode?

Edit:De NOT EXIST query wordt hier telkens van voor af aan gestart zie ik nu. Waardoor ik waarschijnlijk meerdere keren dezelfde row terug ga krijgen.

[ Voor 13% gewijzigd door iznogood op 20-10-2012 13:47 ]

Just as Good


  • frG
  • Registratie: Augustus 2004
  • Laatst online: 20-11 20:03

frG

Is de ISNULL functie hier niet geschikt voor?

ISNULL ( check_expression , replacement_value )

  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 02:47
Ik zat meer te kijken naar het antwoord erboven, je query wordt dan
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT SQL_CALC_FOUND_ROWS *
FROM tpl_translations_page 
WHERE lang_code='preferred_language' AND (lang_phrase="bla" OR lang_phrase="bla")

UNION ALL

SELECT *
FROM tpl_translations_page
WHERE 
FOUND_ROWS() = 0 AND lang_code='default_language' AND (lang_phrase="bla" OR lang_phrase="bla")

  • iznogood
  • Registratie: September 2001
  • Niet online
Gtoniser schreef op zaterdag 20 oktober 2012 @ 13:50:
Ik zat meer te kijken naar het antwoord erboven, je query wordt dan
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT SQL_CALC_FOUND_ROWS *
FROM tpl_translations_page 
WHERE lang_code='preferred_language' AND (lang_phrase="bla" OR lang_phrase="bla")

UNION ALL

SELECT *
FROM tpl_translations_page
WHERE 
FOUND_ROWS() = 0 AND lang_code='default_language' AND (lang_phrase="bla" OR lang_phrase="bla")
Ja, dat klopt, maar de lang_phrase die al gevonden is hoeft niet meer voor te komen in de UNION, dus wanneer de eerste bla gevonden is mag deze uit het OR statement gehaald worden. De output zou als volgt moeten zijn:

code:
1
2
3
4
lang_id, lang_code, lang_phrase, lang_translation
0 , EN , tag1 , translated text <- default language
1 , NL , tag2 , translated text <- pagina language
2 , EN , tag3 , translated text <- default language


Eigenlijk heb ik een lijst met tags (lang_phrase) waarvan ik voor iedere tag 1 row wil ophalen en dan bij voorkeur degene die de pagina language in de row heeft.

tags mogen niet vaker dan 1x voorkomen in de results, wanneer de pagina language niet gevonden is, dan overschakelen naar de default language. M.a.w zoveel mogelijk translaten, wanneer dat niet mogelijk is de default teruggeven

[ Voor 6% gewijzigd door iznogood op 20-10-2012 14:16 ]

Just as Good


  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 02:47
Ok, ik ging er vanuit dat dit om een enkele tag ging.

Voor alle tags kun je het volgende proberen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM tpl_translations_page 
WHERE lang_code='preferred_language' AND lang_phrase IN ('bla','bla2','bla3')

UNION ALL

SELECT *
FROM tpl_translations_page
WHERE 
 lang_code='default_language' AND lang_phrase IN ('bla','bla2','bla3') AND lang_phrase NOT IN ( 
SELECT lang_phrase FROM  tpl_translations_page 
WHERE lang_code='preferred_language' AND lang_phrase IN ('bla','bla2','bla3')
)

Ik denk dat dit de efficientste manier is

  • iznogood
  • Registratie: September 2001
  • Niet online
Gtoniser schreef op zaterdag 20 oktober 2012 @ 14:16:
Ok, ik ging er vanuit dat dit om een enkele tag ging.

Voor alle tags kun je het volgende proberen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM tpl_translations_page 
WHERE lang_code='preferred_language' AND lang_phrase IN ('bla','bla2','bla3')

UNION ALL

SELECT *
FROM tpl_translations_page
WHERE 
 lang_code='default_language' AND lang_phrase IN ('bla','bla2','bla3') AND lang_phrase NOT IN ( 
SELECT lang_phrase FROM  tpl_translations_page 
WHERE lang_code='preferred_language' AND lang_phrase IN ('bla','bla2','bla3')
)

Ik denk dat dit de efficientste manier is
Geweldig _/-\o_ dit lijkt te werken!!

Just as Good

Pagina: 1