我正在编写一个业务目录,我使用MySQL来存储数据。我想在这种情况下使用三个表:列表,区域和类别。列表有标题和说明。地区和类别都有标题。我想创建一个搜索功能,允许用户将列表标题和描述的关键字与类别和区域标题组合在一起。例如,如果有人搜索字符串“宾夕法尼亚州的芝士蛋糕”,他们将获得费城芝士蛋糕工厂的结果。我可以用MATCH(列)AGAINST(关键字)吗?
下面的MySQL查询当前正在向MATCH
返回错误的错误参数SELECT
l.listing_id AS id, l.category_id, l.title AS listing_title, l.description, l.address, l.city, l.zip, UNIX_TIMESTAMP(l.date_submitted) AS date_submitted, l.latitude, l.longitude,
( 6371 * acos( cos( radians(40.293861) ) * cos( radians( l.latitude) ) * cos( radians( l.longitude ) - radians(-76.600252) ) + sin( radians(40.293861) ) * sin( radians( l.latitude ) ) ) ) AS distance,
c.category_id AS cat_id, c.title AS cat_title, c.slug AS cat_slug,
r.region_id AS region_id, r.title AS region_title, r.slug AS region_slug
FROM listings AS l
LEFT JOIN categories AS c ON l.category_id = c.category_id
LEFT JOIN regions AS r ON l.region_id = r.region_id
WHERE MATCH (l.title,l.description,l.city,r.title,c.title) AGAINST ('cheesecake in pennsylvania')
如果我从匹配列中删除r.title和c.title,它可以正常工作。这是SQLFIddle进一步证明。除了使用匹配之外,我也对其他想法采取更好的方式。
答案 0 :(得分:1)
我不这么认为。 MATCH()
中命名的列必须是单个全文索引的一部分,但不能在多个表中定义单个全文索引。
您可能需要将三个MATCH()
子句与OR
结合使用(就像我在此处的示例中所做的那样:http://sqlfiddle.com/#!9/89719/11)。
答案 1 :(得分:0)
你需要有文本索引。
你首先改变表并像这样执行Sql Query
public WMain() {
System.Windows.Forms.Application.EnableVisualStyles();
InitializeComponent();
WbThumbs.DocumentCompleted += WbThumbsOnDocumentCompleted;
WbThumbs.Navigate("www.blabla.com");
}
private void WbThumbsOnDocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e) {
if (WbThumbs.Document == null) return;
WbThumbs.Document.Click += WbThumbs_Click;
}
private void WbThumbs_Click(object sender, System.Windows.Forms.HtmlElementEventArgs e) {
var doc = WbThumbs.Document;
var src = doc?.GetElementFromPoint(e.ClientMousePosition);
if (src == null) return;
//...
}
和查询立即运行
alter table listings add fulltext index_text(title);
alter table listings add fulltext index_text(description);
alter table listings add fulltext index_text(city);
alter table categories add fulltext index_text(title);
alter table regions add fulltext index_text(title);
答案 2 :(得分:0)
您编写的查询似乎正在工作,除非您无法传递参数以匹配多个表。 如果你从查询中删除最后两个参数,那么它可以正常工作