MySQL MATCH()反对()

时间:2013-04-30 21:34:59

标签: mysql sql 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%"一起使用?

4 个答案:

答案 0 :(得分:3)

由于date的数据类型为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的日期参数。

答案 1 :(得分:1)

' - '在全文搜索语法中具有特殊含义(单词应该不存在)。将短语括在双引号中以仅匹配包含短语的行。即:

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

而且,通常,更好的方法是将日期作为日期类型处理,而不是字符串。

答案 2 :(得分:1)

FULLTEXT不是一个精确的操作,而且价格昂贵。在1个查询中进行2次FULLTEXT次搜索总是一个坏主意。改为使用LIKE或日期函数。

1)

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

2)

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

答案 3 :(得分:0)

在查询的where子句中使用函数会降低生产速度,尤其是在索引字段上。此外,如果您的日期字段包含时间组件(通常是这种情况),则忽略时间组件可能会导致错误的结果。

这种方法很难改进:

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

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