2012-06-21 67 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;