2012-06-21 68 views
2

我正在嘗試將分頁添加到查詢全文索引表的結果中。下面是該查詢:全文搜索中的MySql SQL_CALC_FOUND_ROWS問題

普通查詢

SELECT *,MATCH(title) AGAINST ("+samsung +galaxy +s3" IN BOOLEAN MODE) 
as score FROM `deals` WHERE `image`!='' AND category=15032 ORDER BY score DESC; 

它返回行。

爭取做分頁

SELECT SQL_CALC_FOUND_ROWS *,MATCH(title) AGAINST 
("+samsung +galaxy +s3" IN BOOLEAN MODE) as score FROM `deals` 
WHERE `image`!='' AND category=15032 ORDER BY score DESC LIMIT 8; 

返回8行如預期,因爲我想每頁顯示8個項目。

然後

SELECT FOUND_ROWS(); 

它返回20項目,而不是183作爲原始查詢即將到來。我不確定可能會導致這種情況。你能幫我解決這個問題嗎?

謝謝。

回答

0

你做錯了,做你需要兩個限制分頁,開始和結束,看看這個例子中,正確添加限制你的代碼

mysql> select * from t1 order by actor_id; 
+----------+-------------+--------------+---------------------+ 
| actor_id | first_name | last_name | last_update   | 
+----------+-------------+--------------+---------------------+ 
|  1 | PENELOPE | GUINESS  | 2006-02-15 04:34:33 | 
|  2 | NICK  | WAHLBERG  | 2006-02-15 04:34:33 | 
|  3 | ED   | CHASE  | 2006-02-15 04:34:33 | 
|  4 | JENNIFER | DAVIS  | 2006-02-15 04:34:33 | 
|  5 | JOHNNY  | LOLLOBRIGIDA | 2006-02-15 04:34:33 | 
|  6 | BETTE  | NICHOLSON | 2006-02-15 04:34:33 | 
|  7 | GRACE  | MOSTEL  | 2006-02-15 04:34:33 | 
|  8 | MATTHEW  | JOHANSSON | 2006-02-15 04:34:33 | 
|  9 | JOE   | SWANK  | 2006-02-15 04:34:33 | 
|  10 | CHRISTIAN | GABLE  | 2006-02-15 04:34:33 | 
|  11 | ZERO  | CAGE   | 2006-02-15 04:34:33 | 
|  12 | KARL  | BERRY  | 2006-02-15 04:34:33 | 
|  13 | UMA   | WOOD   | 2006-02-15 04:34:33 | 
|  14 | VIVIEN  | BERGEN  | 2006-02-15 04:34:33 | 
|  15 | CUBA  | OLIVIER  | 2006-02-15 04:34:33 | 
|  16 | FRED  | COSTNER  | 2006-02-15 04:34:33 | 
|  17 | HELEN  | VOIGHT  | 2006-02-15 04:34:33 | 
|  18 | DAN   | TORN   | 2006-02-15 04:34:33 | 
|  19 | BOB   | FAWCETT  | 2006-02-15 04:34:33 | 
|  20 | LUCILLE  | TRACY  | 2006-02-15 04:34:33 | 
.... 

+----------+-------------+--------------+---------------------+ 
201 rows in set (0.00 sec) 

現在你申請的限制,開始並最終

mysql> select * from t1 order by actor_id limit 0,5; 
+----------+------------+--------------+---------------------+ 
| actor_id | first_name | last_name | last_update   | 
+----------+------------+--------------+---------------------+ 
|  1 | PENELOPE | GUINESS  | 2006-02-15 04:34:33 | 
|  2 | NICK  | WAHLBERG  | 2006-02-15 04:34:33 | 
|  3 | ED   | CHASE  | 2006-02-15 04:34:33 | 
|  4 | JENNIFER | DAVIS  | 2006-02-15 04:34:33 | 
|  5 | JOHNNY  | LOLLOBRIGIDA | 2006-02-15 04:34:33 | 
+----------+------------+--------------+---------------------+ 
5 rows in set (0.00 sec) 

mysql> select * from t1 order by actor_id limit 6,5; 
+----------+------------+-----------+---------------------+ 
| actor_id | first_name | last_name | last_update   | 
+----------+------------+-----------+---------------------+ 
|  7 | GRACE  | MOSTEL | 2006-02-15 04:34:33 | 
|  8 | MATTHEW | JOHANSSON | 2006-02-15 04:34:33 | 
|  9 | JOE  | SWANK  | 2006-02-15 04:34:33 | 
|  10 | CHRISTIAN | GABLE  | 2006-02-15 04:34:33 | 
|  11 | ZERO  | CAGE  | 2006-02-15 04:34:33 | 
+----------+------------+-----------+---------------------+ 
5 rows in set (0.00 sec) 

mysql> select * from t1 order by actor_id limit 11,5; 
+----------+------------+-----------+---------------------+ 
| actor_id | first_name | last_name | last_update   | 
+----------+------------+-----------+---------------------+ 
|  12 | KARL  | BERRY  | 2006-02-15 04:34:33 | 
|  13 | UMA  | WOOD  | 2006-02-15 04:34:33 | 
|  14 | VIVIEN  | BERGEN | 2006-02-15 04:34:33 | 
|  15 | CUBA  | OLIVIER | 2006-02-15 04:34:33 | 
|  16 | FRED  | COSTNER | 2006-02-15 04:34:33 | 
+----------+------------+-----------+---------------------+ 
5 rows in set (0.00 sec) 

這樣的想法是使用LIMIT $begin,$number_results,當你點擊下一步將採取的number_result + total_result_per_page,並把它在$開始。 ($ begin = 10 + 10 + 10 = 30)

select ..... where ... order ... LIMIT 30,10

(可能是您在第3頁,每頁顯示10個結果)

EDI:

的FOUND_ROWS將返回從表到你的極限的開始,

mysql> select * from t2 order by actor_id limit 10; 
+----------+------------+--------------+---------------------+ 
| actor_id | first_name | last_name | last_update   | 
+----------+------------+--------------+---------------------+ 
|  1 | PENELOPE | GUINESS  | 2006-02-15 04:34:33 | 
|  2 | NICK  | WAHLBERG  | 2006-02-15 04:34:33 | 
|  3 | ED   | CHASE  | 2006-02-15 04:34:33 | 
|  4 | JENNIFER | DAVIS  | 2006-02-15 04:34:33 | 
|  5 | JOHNNY  | LOLLOBRIGIDA | 2006-02-15 04:34:33 | 
|  6 | BETTE  | NICHOLSON | 2006-02-15 04:34:33 | 
|  7 | GRACE  | MOSTEL  | 2006-02-15 04:34:33 | 
|  8 | MATTHEW | JOHANSSON | 2006-02-15 04:34:33 | 
|  9 | JOE  | SWANK  | 2006-02-15 04:34:33 | 
|  10 | CHRISTIAN | GABLE  | 2006-02-15 04:34:33 | 
+----------+------------+--------------+---------------------+ 
10 rows in set (0.00 sec) 

mysql> select found_rows(); 
+--------------+ 
| found_rows() | 
+--------------+ 
|   10 | 
+--------------+ 
1 row in set (0.00 sec) 

mysql> select * from t2 order by actor_id limit 2,10; 
+----------+------------+--------------+---------------------+ 
| actor_id | first_name | last_name | last_update   | 
+----------+------------+--------------+---------------------+ 
|  3 | ED   | CHASE  | 2006-02-15 04:34:33 | 
|  4 | JENNIFER | DAVIS  | 2006-02-15 04:34:33 | 
|  5 | JOHNNY  | LOLLOBRIGIDA | 2006-02-15 04:34:33 | 
|  6 | BETTE  | NICHOLSON | 2006-02-15 04:34:33 | 
|  7 | GRACE  | MOSTEL  | 2006-02-15 04:34:33 | 
|  8 | MATTHEW | JOHANSSON | 2006-02-15 04:34:33 | 
|  9 | JOE  | SWANK  | 2006-02-15 04:34:33 | 
|  10 | CHRISTIAN | GABLE  | 2006-02-15 04:34:33 | 
|  11 | ZERO  | CAGE   | 2006-02-15 04:34:33 | 
|  12 | KARL  | BERRY  | 2006-02-15 04:34:33 | 
+----------+------------+--------------+---------------------+ 
10 rows in set (0.00 sec) 

mysql> select found_rows(); 
+--------------+ 
| found_rows() | 
+--------------+ 
|   12 | 
+--------------+ 
1 row in set (0.00 sec) 

這是12,因爲10的結果顯示+的ID 1和2 + 10顯示的結果

0

嘗試使用HAVING代替WHERE

SELECT SQL_CALC_FOUND_ROWS 
    *, 
    MATCH(title) AGAINST ("+samsung +galaxy +s3" IN BOOLEAN MODE) as score 
FROM `deals` 
HAVING`image`!='' 
    AND category=15032 
ORDER BY score DESC 
LIMIT 8;