2015-12-02 38 views
1

我有一张表,用于存储我希望从中提取最相关数据的语言信息。如果您要求的语言可用,则应该使用该语言。如果不是,那么它应该返回一个默认值。从MySQL中的每个分组数据中获取单个记录

的数据是这样的:

ID PARENT_ID NAME LANG 
1 1   test default 
2 1   test en-GB 
3 1   test fr 
4 4   Hello default 
5 4   Hello en-GB 
6 4   Hola es 

如果我想获得的所有西班牙语的结果,那么我应该能够得到记录6和记录1,因为第一套不包含西班牙语版。我会怎么做呢?

这是最接近我可以查询得到,但我总是得到默认,从来没有西班牙的结果:

SELECT h_id, 
    h_faq_id, 
    h_question, 
    h_language 
FROM 
    h_itsm_faqs 
WHERE 
    h_language = 'default' 
OR 
    h_language LIKE 'es' 
GROUP BY 
    h_faq_id 
ORDER BY 
    (CASE WHEN h_language LIKE 'es' THEN 1 ELSE 2 END) ASC 

我看到的选项如下:

  1. 一查询以获得两个(不知道如何做到这一点)
  2. 两个查询来获得语言和默认值,然后找出我需要的
  3. 获取所有结果并通过它们排序

选项1会很棒,但值得注意的是,选项3在分页时可能会出现问题。

+0

为什么比较字符串首先与'='和后来用'LIKE'比较? – Oli

+0

另外,您的GROUP BY会在ORDER BY发生之前折叠数据,所以您总是会得到默认的 – Oli

+0

@Oli对于我来说''''或'LIKE'对我无关紧要,但我们确保了默认总是小写字母,并且仅适用于语言有时可能会大写的情况,因为数据可能来自多个来源。我怀疑'GROUP BY'发生了什么,但希望'CASE'和'ORDER BY'会首先发生。 – cchana

回答

2

一种可能的方法是使用左连接将表与自身结合在一起。然后,您可以使用默认和特定语言。

SELECT 
    f1.id, 
    f1.parent_id, 
    f1.name AS 'default_name', 
    f2.name AS 'translated_name' 
FROM 
    h_itsm_faqs f1 LEFT JOIN h_itsm_faqs f2 ON (f1.parent_id = f2.parent_id AND f2.language LIKE 'es') 
WHERE 
    f1.language = 'default' 
相关问题