SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.07.2020 12:03:30

Alex Krochet
Участник
Зарегистрирован: 12.07.2020
Сообщений: 1

Как использовать SQL_CALC_FOUND_ROWS рядом с DISTINCT?

Всем привет. Есть у меня следующий запрос:

SELECT DISTINCT SQL_CALC_FOUND_ROWS SUBSTRING(color, 1, 5) as color FROM products WHERE color LIKE '$color%' AND type LIKE '$type%';

И дальше за ним следует:

SELECT FOUND_ROWS();


с той целью, чтобы в итоге получить то количество записей, как если бы в запросе отсутствовало слово DISTINCT. Однако, после SELECT FOUND_ROWS() я получаю снова только список уникальных записей, а не все записи, которые удовлетворяют WHERE условию.

При поиске в ПС не нашел точной информации, работает ли вообще SQL_CALC_FOUND_ROWS рядом с DISTINCT. Поэтому хочу получить подсказку - как поправить/изменить мой запрос, чтобы получить в итоге как уникализированный список, так и неуникализированный список.

Я держу в уме, само собой, что можно убрать distinct из запроса и выполнить уникализацию уже после запроса (средствами php), например, с помощью функции array_unique(), но по некоторым причинам данный способ мне не подходит, хочу решить эту задачу именно ресурсами sql

Неактивен

 

#2 12.07.2020 13:20:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как использовать SQL_CALC_FOUND_ROWS рядом с DISTINCT?

Alex Krochet написал:

Всем привет. Есть у меня следующий запрос:

SELECT DISTINCT SQL_CALC_FOUND_ROWS SUBSTRING(color, 1, 5) as color FROM products WHERE color LIKE '$color%' AND type LIKE '$type%';

И дальше за ним следует:

SELECT FOUND_ROWS();


с той целью, чтобы в итоге получить то количество записей, как если бы в запросе отсутствовало слово DISTINCT. Однако, после SELECT FOUND_ROWS() я получаю снова только список уникальных записей, а не все записи, которые удовлетворяют WHERE условию.

Так и должно быть. SQL_CALC_FOUND_ROWS запоминает кол-во записей, возвращаемых запросом как если бы не было LIMIT. Без LIMIT его нет смысла использовать.
С LIMIT тоже нужно использовать с осторожностью, см https://sqlinfo.ru/forum/viewtopic.php?id=6876

Ваша задача решается в 2 запроса:

SELECT DISTINCT SUBSTRING(color, 1, 5) as color FROM products WHERE color LIKE '$color%' AND type LIKE '$type%';
SELECT count(*) FROM products WHERE color LIKE '$color%' AND type LIKE '$type%';
 

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson