2012-06-21 4 views
2

Я пытаюсь добавить разбивку на страницы в свои результаты, которые запрашивают индексированную таблицу FULL-TEXT. Вот запрос:Вопрос MySql SQL_CALC_FOUND_ROWS в поиске FULL-TEXT

Нормальный запрос

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

возвращает строки.

Попытка сделать PAGINATION

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 и положить его в $ начать. Допустим, что вы находитесь на стр. 3, и вы показываете 10 результатов на странице. ($ Begin = 10 + 10 + 10 = 30)

выбрать ..... где .... заказать ... LIMIT 30,10

ЭОД:

в 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 результат отображается + идентификатор 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;