繁体   English   中英

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

[英]How do I use columns from a joined table in a match against clause in MySQL?

我正在编写一个业务目录,并使用MySQL来存储数据。 在这种情况下,我要使用三个表:清单,区域和类别。 清单包含标题和说明。 地区和类别都有标题。 我想创建一个搜索功能,使用户可以将列表标题和描述的关键字与类别和区域标题结合在一起。 例如,如果有人搜索字符串“ Cheesecake in Pennsylvania”,他们将获得Philly的The Cheesecake Factory的结果。 我可以使用匹配(列)反对(关键字)吗?

下面的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 除了使用match之外,我也乐于接受其他想法,以实现更好的效果。

我不这么认为。 MATCH()命名的列必须是单个全文索引的一部分,但是您不能在多个表中定义单个全文索引。

您可能需要将三个MATCH()子句与OR组合在一起(就像我在您的示例中所做的那样: http : //sqlfiddle.com/#!9/89719/11 )。

您需要文本索引。

您首先更改表并像这样执行Sql查询

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);

和查询立即运行

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')`

您编写的查询似乎可以正常工作,只是您无法传递参数以匹配多个表。 如果您从查询中删除最后2个参数,则它运行良好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM