#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