我的问题先是然后(许多…信息):当我希望用户能够从下拉框中选择多个答案,将其保存在他们的个人资料中,然后让其他用户输入他们的搜索标准(可以再次是多个),并最终通过这些多个搜索标准找到用户时,我的可用性和速度选项是什么?
信息:目前,我正忙于我的网站的一部分是婚介系统,很像交友网站使用的系统。
(我的网站使用Mysqli、PHP和jQuery)
我以一个交友网站为例来阐述我的问题:用户a填写他/她的个人资料,并输入他们对某个汽车品牌的偏好:宝马、大众和梅赛德斯。用户B想在网站上搜索喜欢宝马和/或梅赛德斯的会员。
我最初的想法是让用户A填写一个输入多个html字段,并将其存储为数据库中一列中的数组(或逗号分隔)。然后找出如何在为用户B存储数组的列中选择搜索。
所以基本上用户A可以在他们的个人资料中输入多个汽车品牌,用户B可以给出他们的标准也是多个汽车商标;select查询应该获取匹配条件的任何行。
输入字段倍数看起来像:
<tr><td>Which car brand(s) do you like?</td><td>
<select multiple name="CarBrandPref[]">
<option value="BMW" > BMW</option>
<option value="Ford" > Ford</option>
<option value="Mercedes" > Mercedes </option>
<option value="GMC" > GMC</option>
<option value="Volkswagen" > Volkswagen </option>
<option value="Toyota" > Toyota </option>
<option value="Audi" > Audi </option>
</select>
</td></tr>
配置文件表的布局类似于:
Id Name CarbrandPref
--------------------------------------------------------
1 Mike bmw,volkswagen,mercedes
2 Paul Mercedes, ford, GMC
3 Axel GMC, ford, toyota, audi
4 John ford, bmw
用户B会给出搜索条件"宝马和奔驰"。然后查询应该返回3行:
Id Name CarbrandPref
---------------------------------------------------------
1 Mike bmw,volkswagen,mercedes
2 Paul Mercedes, ford, GMC
4 John ford, bmw
当我在SO和其他网站上搜索时,我注意到每个人都说这(存储在数据库中的数组中)对性能等不利。此外,我无法通过mysql中的数组进行选择搜索。
所以现在我不知道该怎么办。我不想为每个possble碳水化合物添加一列,但还能做什么呢?有人能帮我吗?任何想法都非常感谢!
我希望这足够清楚,有人可以帮助我。如果不是,请告诉我,我会添加所需的信息。
我使用这些链接可以将下拉框填充的数组存储到mysql数据库中:
http://www.aleixcortadellas.com/main/2009/03/20/492/
http://toolspot.org/how-to-store-array-mysql.php
您有三个选择。
第一种方法是沿着你是一体的路径,尝试比较两个逗号分隔的列表。这会产生非常非常难看的SQL。它不允许索引。基本思想是这样的:
where find_in_set(substring_index(@list, ',', 1), CarBrands) > 0 or
find_in_set(substring_index(substring_index(@list, ',', 2), ',', -1), CarBrands) > 0 or
. . .
第二个是引入一个新的表,它有一行供用户使用,还有一个收藏夹。让我们将其通用化,这样就有一个用户列、一个类别列("CarBrand")和一个名称。然后查询看起来像:
from Profile p left outer join
Favorites f
on p.userId = f.userId and f.Category = 'CarBrand'
group by p.userId
having sum(f.Name = 'Mercedes') > 0 and
sum(f.Name = 'BMW') > 0;
第三个选项是使用全文搜索和match
功能。文档在这里。
我的猜测是,全文索引可能是你做你想做的事情的最简单方法。
编辑:
关于全文索引与选项2的查询。关键问题可能与停止语和短词有关。例如,全文索引会删除少于4个字符的单词(默认情况下,您可以同时更改这两个字符)。它还有一个停止词列表。
我个人倾向于使用第二种选择。但原因可能不太好。它使用标准SQL,我对数据结构和查询很熟悉。因此,它让我对结果有了更多的控制权。
在您的情况下,全文搜索可能更容易快速实现,而且很可能同样快或更快。全文搜索还允许您进行更复杂的布尔运算,例如混合"AND"answers"OR",以及进行自然语言搜索以获得相关性值。
您应该使用第三个表在用户和汽车品牌之间进行映射。该表将有一个覆盖两列的主键,每列都是其他两个表之一的外键。"巴斯蒂安"answers"宝马"之间的映射表中出现了一行,这意味着他选择了那个品牌。没有这样的行意味着不存在关联。
更具体地说,表1有用户,表2有汽车品牌。每一个都有一个id为#的主键列。第三张表将这两者联系起来。请参阅MySQL中的多对多关系以及此处和此处的