我正在尝试建立一个可搜索的数据库,其中包含我的用户所说的语言。
例如我可能有

$john = array("english", "french", "spanish");
$jack = array("french", "spanish");
$jill = array("english", "spanish");

我想把它们保存到一个mysql数据库中,这样我以后可以按照(伪代码)的方式运行一些东西
SELECT * FROM users WHERE spoken_languages = "french" and "spanish"

我知道如果我有speaks_englishspeaks_frenchspeaks_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/

10-09 02:25
查看更多