MySQL SELECT:通过Unicode查找所有语言

时间:2014-05-03 20:16:14

标签: python mysql select

我正在寻找一个相当棘手的(对我来说)SELECT语句,它将从语言定义DB中计算字体文件的所有支持语言。

字体的unicodes存储在列表“unicodes' (我们是Python)。 语言DB有两列,一列是语言名称,另一列是整数形式的一个unicode,如下所示:

(language) - (unicode)
English - 97 #a
English - 98 #b
English - 99 #c
German - 97 #a
German - 98 #b
German - 99 #c
German - 228 #ä

我当前的SQL语句如下:

"SELECT DISTINCT language FROM languagedefinitions WHERE unicode = %s;" % (' OR unicode = '.join(map(str, unicodes())))

问题在于,这将推出字体部分支持的所有语言。具有unicodes 97-99的字体将输出英语和德语,而字体中缺少德语(228)所需的一个unicode。

我需要的只是那些字体完全支持的语言,例如字体中存在一种语言的所有unicodes。 如果字体中缺少一种语言的一个或多个unicodes(例如,在示例中为228),则德语不会显示。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用子查询。使用子查询,我们选择其中包含未包含在字体中的unicodes的语言:

SELECT DISTINCT language FROM languagedefinitions WHERE unicode NOT IN (97,98,99)

然后我们选择子查询中未选择的所有语言。所以,完整的查询会像这样llok:

SELECT DISTINCT language FROM languagedefinitions WHERE language NOT IN (
    SELECT DISTINCT language FROM languagedefinitions WHERE unicode NOT IN (97,98,99);
);

答案 1 :(得分:0)

NorthCat的SQL-only子查询解决方案可以工作,但使用集合(0.0004s)比Python中的迭代实现要长得多(0.05s):

from sets import Set
# First step, get all languages
languagenames = web.db.dbexec("SELECT DISTINCT language FROM languagedefinitions;")
# Second step, get all unicodes from one language and compare them against the font using sets.Set()
supportedLanguages = []
for languagename in languagenames:
    unicodesPerLanguage = web.db.dbexec("SELECT unicode FROM languagedefinitions WHERE language = '%s';" % (languagename))
    if Set(x[0] for x in unicodesPerLanguage).issubset(Set(unicodesInFont)):
        supportedLanguages.append(languagename[0])