2016-10-28 2 views
2

У меня проблема с MYSQL. SQL_CALC_FOUND_ROWS и FOUND_ROWS() работают некорректно.MYSQL. SQL_CALC_FOUND_ROWS и FOUND_ROWS() работают некорректно

Издание:

  • первый раз совокупный доход 1
  • второй раз общий возвращает правильный номер версии 3.500

MYSQL:

MySQL Вер 14.14 Distrib 5.7. 10, для osx10.9 (x86_64) с использованием обертки EditLine

Я пытаюсь вернуть список из таблиц, а другой столбец в этом списке будет повторяться для каждой строки. (содержащий полные строки для выбора).

Таким образом, я могу получить все данные и общее число строк в одном выберите ...

Выберите ниже.

SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM 
     (SELECT A.MEMBER_ID, A.USERNAME, B.ZIP, B.INTERESTS, C.ADDRESS 
     FROM MEMBER A, DATA B, ADDRESS C   
     WHERE A.GENDER = "F" 
     AND A.MEMBER_ID = B.MEMBER_ID 
     AND A.MEMBER_ID = C.MEMBER_ID 
     AND UPPER (A.CANCEL_FLAG) = "N"  
     ORDER BY A.LAST_LOGIN_DATE DESC) res,  
    (select FOUND_ROWS() as "total_result" from dual) tot  
    Limit 1, 15 
+0

1.) Является ли ORDER BY правильно на внутренний SELECT, или если закрытие ")" перед ORDER BY? 2.) У вас есть немного больше информации о типе и структуре таблиц? – sebkrueger

+0

зачем ему закрывать ")" перед ORDER BY? 2.) Таблицы являются основными таблицами. Я не думаю, что в них есть что-то особенное. Я просто пытаюсь вернуть список из таблицы и другой столбец, который будет повторяться для каждой строки .., содержащий полные строки ... Таким образом, я могу получить все данные и полные строки в одном select ... – philipfwilson

+0

'select FOUND_ROWS() 'сообщает вам количество строк, найденных последним, а не текущим. Итак, вы видите ожидаемый результат. –

ответ

2

Если вы хотите, чтобы сделать эту работу в MySQL, вы можете сделать подзапрос с помощью COUNT. Возможно, вы сможете сделать это проще, только считая таблицу MEMBER, если вы можете предположить, что MEMBER_ID всегда существует в DATA и ADDRESS.

SELECT * FROM (
    SELECT A.MEMBER_ID, A.USERNAME, B.ZIP, B.INTERESTS, C.ADDRESS 
     FROM MEMBER A, DATA B, ADDRESS C   
     WHERE A.GENDER = "F" 
      AND A.MEMBER_ID = B.MEMBER_ID 
      AND A.MEMBER_ID = C.MEMBER_ID 
      AND UPPER (A.CANCEL_FLAG) = "N"  
     ORDER BY A.LAST_LOGIN_DATE DESC 
) res, (
    SELECT COUNT(*) as "total_result" 
     FROM MEMBER A 
      JOIN DATA B ON A.MEMBER_ID = B.MEMBER_ID 
      JOIN ADDRESS C ON A.MEMBER_ID = C.MEMBER_ID 
     WHERE A.GENDER='F' 
) tot  
LIMIT 1, 15 

См https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ для обсуждения ли это страшно или нет.

+1

Это должно работать, но чтобы удвоить весь запрос, просто чтобы получить общий результат, для меня это не бог. Я бы предпочел разные запросы. Один с «SQL_CALC_FOUND_ROWS» и LIMIT, а второй с «FOUND_ROWS()» – sebkrueger

+0

Право - см. Ссылку для обсуждения того, какая из этих функций более эффективна. На практике кажется, что «очевидный» ответ не всегда прав. –

+0

знают о ссылке и обновлении percona, но SQL_CALC_FOUND_ROWS выглядит немного более прямолинейным, и на практике вам следует взглянуть, сколько вы выработаете с помощью «COUNT (*)». – sebkrueger

0

Хорошо. Я понял это.

Я использую хранимую процедуру.

Я только что сделал второй выбор. выберите FOUND_ROWS() как 'total_result' из dual;

Это вернуло правильное значение.

Благодаря Фил

+0

это работает, но теперь работает с заказом. Я использую MySql и SQL_CALC_FOUND_ROWS. Кажется, это отключает порядок order by. MySql версии сервера: 5.7.15-0ubuntu0.16.04.1 (Ubuntu) ВЫБРАТЬ SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM ( отключает предложения ORDER BY – philipfwilson

Смежные вопросы