示例表:
id name alias_page lang content
1 nombre_pagina nombre_pagina es spanish content
2 page_name nombre_pagina en english content
3 pagina_2 pagina_2 es spanish content
在上表中,每个页面都有一个母语名称,alias_page只有一种语言(西班牙语)
返回英文页面(id = 2),因为匹配alias_page和lang
SELECT * FROM content
WHERE
(name = 'nombre_pagina' OR alias_page = 'nombre_pagina')
AND
lang = 'en'
LIMIT 1;
但如果页面不存在于所请求的语言中(例如:pagina_2
),我需要用另一种语言检索它(西班牙语默认为自动翻译目的)
我的解决方案1(结果将在PHP中管理):
SELECT * FROM content
WHERE
(name = 'pagina_2' OR alias_page = 'pagina_2')
AND
(lang = 'en' OR lang = 'es')
LIMIT 2;
我的解决方案2:
SELECT SQL_CALC_FOUND_ROWS * FROM content
WHERE
(name = 'pagina_2' OR alias_page = 'pagina_2')
AND
(lang = 'en')
LIMIT 1;
if(FOUND_ROWS() = 0) THEN
SELECT FROM content
WHERE
(name = 'pagina_2' OR alias_page = 'pagina_2')
AND
(lang = 'es')
LIMIT 1;
END IF;
两者中哪一个更好? 还是比其他解决方案更好的另一种解决方案?
答案 0 :(得分:1)
您可以使用原始查询,稍微修改一下,将所需的语言放在结果集的顶部。然后,按原样使用LIMIT
:
SELECT *
FROM content
WHERE
(name = 'nombre_pagina' OR alias_page = 'nombre_pagina')
ORDER BY
CASE WHEN lang = 'en' THEN 0 ELSE 1 END
LIMIT 1;
如果有内容的英语版本,即使其他语言中存在相同的内容,也会通过上述查询返回。如果英语不可用,但例如西班牙语,然后这个替代内容将被退回。