2013-04-30 160 views
2

我想查找date爲「2013-04」的數據庫中的所有記錄。MySQL MATCH()AGAINST()

我用:

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%"

+0

'date'是什麼類型? – mickfold 2013-04-30 22:11:07

+0

@penfold類型日期是'date''0000-00-00' – user2287965 2013-04-30 22:20:39

回答

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

+0

如果日期字段有一個時間組件,使用之間可以導致你錯過記錄 – 2013-04-30 23:10:58

+0

@DanBracuk在問題中,類型被指定爲沒有時間分量的Date。如果它是'DateTime'或'TimeStamp',我同意第二種方法不適合,除非該字段被轉換爲'Date'類型。 – mickfold 2013-05-01 07:45:11

1

' - '在全文搜索語法中有特殊含義(詞應該不存在)。將短語用雙引號括起來,以僅匹配字面上包含該短語的行。如:

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

而且,一般來說,更好的方法是將日期作爲日期類型處理,而不是字符串。

+0

我有變量它沒關係? 'MATCH(date)AGAINST('「。」。$ a_date。「。''IN BOOLEAN MODE)'? – user2287965 2013-04-30 22:24:04

+0

你應該避免雙引號:AGAINST('\「$ a_date \」'IN ... – 2013-04-30 22:33:47

+0

它的工作,但像LIKE()'很慢像;( – user2287965 2013-04-30 22:46:31

1

FULLTEXT不是一個精確的操作,它是昂貴的。在1個查詢中進行2 FULLTEXT搜索總是一個糟糕的主意。改用LIKE或日期函數。

1)

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

2)

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

在使用函數,其中一個查詢的子句趨於生產減慢,特別是在索引的字段。另外,如果您的日期字段包含時間分量(通常是這種情況),那麼忽略時間分量可能會導致錯誤的結果。

這是非常難以改善這種方法:

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

在你的情況,起始日期是2013年4月1日日期和結束日期後的一天是2013年5月1日。由於您使用的是日期參數,因此在EndDate之後的一天不應該那麼困難。