【问题标题】:SQL selection of "best" rowsSQL 选择“最佳”行
【发布时间】:2015-03-04 18:00:36
【问题描述】:

我对 SQL 的了解很肤浅,但对我来说太复杂的查询遇到了麻烦。

我有一个 APPS 表,其中有一列名称和描述,它们是用于引用正确翻译的 ID。我有一个本地化字符串表。

APPS(app_id、name_strid、description_strid) 字符串(str_id、lang_id、字符串)

我需要一个返回所有应用程序的查询,并为每个字符串提供最佳翻译。 最好的语言顺序(让我说:it-it, it, en)

我找到了一个按语言排序所有应用程序的解决方案:

SELECT A.app_id, S1.string, S2.string
FROM APPS as A
JOIN STRINGS AS S1
ON A.name_strid = S1.str_id
JOIN STRINGS AS S2
ON A.description_strid = S2.str_id
WHERE S1.lang_id = S2.lang_id
AND S1.lang_id IN ("it-it", "it", "en")
ORDER BY
   CASE S1.lang_id
      WHEN "it-it" THEN 1
      WHEN "it" THEN 2
      WHEN "en" THEN 3
      ELSE 4
   END;

我怎样才能只获得最好的语言?

谢谢

【问题讨论】:

  • 因此,如果存在 it-it 翻译,它总是最好的翻译,然后它来了,最后 en?

标签: android sql sqlite


【解决方案1】:

在大多数 SQL 方言中,您可以使用 row_number() 解决此问题,但您没有该选项。解决此问题的一种方法是使用相关子查询 - 这会为每个 str_id 提取第一个匹配语言,然后您可以将其用于过滤。

SELECT A.app_id, S1.string, S2.string
FROM APPS as A JOIN
     STRINGS AS S1
     ON A.name_strid = S1.str_id JOIN
     STRINGS AS S2
     ON A.description_str_id = S2.str_id AND
        S1.lang_id = S2.lang_id
WHERE S1.lang_id IN ('it-it', 'it', 'en') AND
      S1.lang_id = (SELECT s3.LangId
                    FROM Strings s3
                    WHERE s3.str_id = S1.str_id
                    ORDER BY (CASE S3.lang_id
                                  WHEN 'it-it' THEN 1
                                  WHEN 'it' THEN 2
                                  WHEN 'en' THEN 3
                                  ELSE 4
                              END)
                   LIMIT 1
                  );

【讨论】:

  • 谢谢。我想你打错字了。将 'ORDER BY (CASE S1.lang_id' 更改为 'ORDER BY (CASE S3.lang_id' 有效!我接受这是正确答案。
  • @ARLabs 。 . .接得好。谢谢。
【解决方案2】:

您可以使用EXISTS 运算符来确保没有其他翻译具有“更好的分数”:

SELECT A.app_id, S1.string, S2.string
FROM APPS as A JOIN STRINGS AS S1 ON A.name_strid = S1.str_id
               JOIN STRINGS AS S2 ON A.description_strid = S2.str_id
WHERE S1.lang_id = S2.lang_id
AND S1.lang_id IN ("it-it", "it", "en")
AND NOT EXISTS (SELECT 1
                FROM STRINGS S3
                WHERE (CASE S3.lang_id
                      WHEN "it-it" THEN 1
                      WHEN "it" THEN 2
                      WHEN "en" THEN 3
                      ELSE 4 END) < (CASE S1.lang_id
                                     WHEN "it-it" THEN 1
                                     WHEN "it" THEN 2
                                     WHEN "en" THEN 3
                                     ELSE 4 END)

【讨论】:

  • 谢谢,但它不起作用。如果我有一个带有“it”本地化的应用程序,我会错过所有其他只有“en”本地化的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多