Количество (*) запроса, имеющего ОГРАНИЧЕНИЕ

#sql #count #limit #mariadb

#sql #количество #ограничение #mariadb

Вопрос:

У меня есть этот SQL-запрос:

 SELECT users.*, users_oauth.* FROM users LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id WHERE (
(MATCH (user_email, user_firstname, user_lastname) AGAINST ('" smith " john"' IN BOOLEAN MODE)) ) 
ORDER BY user_date_accountcreated DESC LIMIT 0,50
  

Есть ли какой-либо способ получить COUNT(*) этот запрос, игнорируя LIMIT 0,50 в этом же запросе?
Или я должен выполнить 2 запроса, один для результатов, один для COUNT (*) ?

Спасибо.

Комментарии:

1. Я считаю, что вы можете поместить все в один запрос, добавив подзапрос для count() . Но внутренне он будет открывать таблицу дважды. Вы пытаетесь вывести вывод на страницу?

2. Вы ищете SQL_CALC_FOUND_ROWS . См.: dev.mysql.com/doc/refman/5.7/en /.

Ответ №1:

Если ваша версия MariaDB 10.2.0 , тогда оконные функции поддерживаются, и вы можете использовать COUNT(*) OVER () :

 SELECT 
  users.*, 
  users_oauth.*,
  COUNT(*) OVER () AS countall
FROM users 
LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
WHERE 
  MATCH (user_email, user_firstname, user_lastname) AGAINST ('" smith " john"' IN BOOLEAN MODE)
ORDER BY user_date_accountcreated DESC 
LIMIT 0,50
  

Если ваша версия MariaDB 10.2.0- (до этого), вы могли бы использовать вложенный выбор в столбце:

 SELECT 
  users.*, 
  users_oauth.*,
  (SELECT count(*)
   FROM users 
   LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
   WHERE MATCH (user_email, user_firstname, user_lastname) AGAINST ('" smith " john"' IN BOOLEAN MODE)
  ) AS countall
FROM users 
LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
WHERE 
  MATCH (user_email, user_firstname, user_lastname) AGAINST ('" smith " john"' IN BOOLEAN MODE)
ORDER BY user_date_accountcreated DESC 
LIMIT 0,50
  

Ответ №2:

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

 SELECT users.*, users_oauth.* , (select count(*) FROM users 
        LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
        WHERE (
          (MATCH (user_email, user_firstname, user_lastname) AGAINST ('" smith " john"' IN BOOLEAN MODE)) ) )
FROM users 
LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
WHERE (
  (MATCH (user_email, user_firstname, user_lastname) AGAINST ('" smith " john"' IN BOOLEAN MODE)) ) 
ORDER BY user_date_accountcreated DESC LIMIT 0,50
  

но если вы хотите добавить только count (*) к столбцам, выбранным в какой-либо версии mysql, вы получаете только строку
, а в других у вас ошибка, потому что вы смешиваете агрегатную функцию и один столбец без объявления предложения group by