mysql限制2对两个查询性能

时间:2017-08-28 12:57:14

标签: mysql

示例表:

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;

两者中哪一个更好? 还是比其他解决方案更好的另一种解决方案?

1 个答案:

答案 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;

如果有内容的英语版本,即使其他语言中存在相同的内容,也会通过上述查询返回。如果英语不可用,但例如西班牙语,然后这个替代内容将被退回。