我正在尝试建立用户所用语言的可搜索数据库。
例如我可能有
$john = array("english", "french", "spanish");
$jack = array("french", "spanish");
$jill = array("english", "spanish");
而且我想将它们保存到MySQL数据库,以便以后可以按照(伪代码)的方式运行某些内容
SELECT * FROM users WHERE spoken_languages = "french" and "spanish"
我知道如果我有speaks_english
,speaks_french
和speaks_spanish
列,那么我可以搜索
SELECT * FROM users WHERE speaks_french = "true" and speaks_spanish = "true"
但是,每次遇到新语言时添加新列的可伸缩性不是很好。我考虑过一张桌子,例如
john | english
john | french
john | spanish
jack | french
jack | spanish
jill | english
jill | spanish
因为至少这样可以找回用户说的语言,所以我可以运行
SELECT * FROM spoken_languages WHERE user = "jack"
但是,为了搜索同时说法语和西班牙语的人,我需要查询所有说法语的用户,所有说西班牙语的用户,然后计算交集。这似乎效率极低。
所以我问你,如何保存这一系列口头语言,以便以后可以在不破坏服务器的情况下搜索数据库?
您的问题中有正确的解决方案,其person_language
表格如下所示
john | english
john | french
jack | spanish
您可以像这样查询它。
SELECT person
FROM person_language
WHERE language IN ( 'english', 'spanish')
GROUP BY person
HAVING COUNT(*) = 2
放置一个索引(language, person)
,这样可以很好地进行扩展。
如果您希望每个会说西班牙语和至少一种其他语言的人都可以这样做。
SELECT a.person
FROM person_language AS a
JOIN ( SELECT person
FROM person_language
GROUP BY person
HAVING COUNT(*) >= 2
) AS b ON a.person = b.person
WHERE a.language = 'spanish'
这使用JOIN指令来使讲西班牙语的人与说两种或更多种语言的人相交。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句