如何在MySQL中的match against子句中使用连接表中的列?

时间:2016-02-06 09:05:37

标签: mysql

我正在编写一个业务目录,我使用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进一步证明。除了使用匹配之外,我也对其他想法采取更好的方式。

3 个答案:

答案 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)

您编写的查询似乎正在工作,除非您无法传递参数以匹配多个表。 如果你从查询中删除最后两个参数,那么它可以正常工作