MySQL MATCH() AGAINST()



我想从数据库中找到date为"2013-04"的所有记录。

我使用

:

SELECT date, pastabos 
FROM aktai 
WHERE MATCH(uzsakovas) AGAINST ('Statyba ir Architektūra, UAB' IN BOOLEAN MODE) 
  AND MATCH(date) AGAINST ('2013-04*' IN BOOLEAN MODE) 

,但它没有给出正确的答案,因为我得到的记录与日期等于' 2013-01-29', '2013-03-28'

我的问题是如何使用MATCH() AGAINST()类功能LIKE()"2013-04%" ?

既然date的数据类型是日期,为什么要使用文本搜索?只需搜索日期:

SELECT date, pastabos 
FROM aktai 
WHERE MATCH(uzsakovas) AGAINST ('Statyba ir Architektūra, UAB' IN BOOLEAN MODE) 
  AND year(date) = :year and  month(date) = :month;

其中:year和:month为整数参数,值分别为2013和04。

或者

SELECT date, pastabos 
FROM aktai 
WHERE MATCH(uzsakovas) AGAINST ('Statyba ir Architektūra, UAB' IN BOOLEAN MODE) 
  AND date between :date_from and :date_to;

其中:date_from和:date_to为日期参数,分别为2013-04-012013-04-30

'-'在全文搜索语法中有特殊含义(word应该不存在)。将短语用双引号括起来,只匹配字面上包含短语的行。例如:

match(date) against ('"2013-04"' in boolean mode)

一般来说,更好的方法是将日期作为日期类型处理,而不是字符串。

FULLTEXT不是一个精确的操作,而且代价很高。在一个查询中有2个FULLTEXT搜索总是一个坏主意。请使用LIKE或日期函数。

1)

WHERE `date` LIKE '2013-04-%' 

2)

WHERE YEAR(`date`) = 2013 AND MONTH(`date`) = 4

在查询的where子句中使用函数往往会降低生成速度,特别是在索引字段上。此外,如果日期字段包含时间组件,那么忽略时间组件可能会导致不正确的结果。

这种方法很难改进:

 where yourdatefield >= StartDate
 and yourdatefield < the day after EndDate

在您的示例中,StartDate是2013-04-01,EndDate的第二天是2013-05-01。由于使用的是日期参数,因此获取EndDate之后的日期应该不难。

相关内容

  • 没有找到相关文章

最新更新