我正在尝试建立一个可搜索的数据库,其中包含我的用户所说的语言。
例如我可能有
$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指令将讲西班牙语的人与讲两种或两种以上语言的人进行交叉。
关于php - 如何将PHP数组保存到MySQL数据库,以便可以搜索数据库中的数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24172783/