#mysql #sql #select #group-by #count
#mysql #sql #выберите #группировка по #количество
Вопрос:
В Mysql у меня есть общая запись count для разбивки на страницы с помощью агрегатной функции COUNT (), а для отображения данных я использую * вместо COUNT (), Но я получил другое общее количество и возвращаемый номер строки.
запрос 1:
SELECT
COUNT(*)
FROM
change_request
INNER JOIN task_main_management ON cr_project_id = project_id
LEFT JOIN all_module AS am
ON
am.m_id = task_m_id
WHERE
cr_tenent_id = '100' AND cr_entity_id = '100' AND cr_project_id = 'PROJ_310820200746367254' AND cr_type = '2' AND change_request.cr_id = '16' AND task_main_management.cr_id = 'CHRQ_020920200807413904'
GROUP BY
change_request.cr_project_id
Он возвращает результат 2.
Но когда я использовал * вместо COUNT (*) в select, он дал мне одну строку.
Комментарии:
1. Поделитесь запросом и результатом с подсчетом и без него
2. Я сомневаюсь, что что-то вроде
select * from ... group by change_request.cr_projectid
работает3. @jainvikram444 запрашивает то же самое, что упоминалось в вопросе. Изменения имеют только поле выбора
*
иcount(*)
.
Ответ №1:
Это ожидаемое поведение.. учитывая
ariaDB [sandbox]> select * from t;
------ -------------------- ------------ ------------ ----------
| id | venue | city | date | time |
------ -------------------- ------------ ------------ ----------
| 1 | Waldorf Hotel | London | 2020-01-01 | 07:00:00 |
| 2 | Waldorf Hotel | London | 2020-01-02 | 07:00:00 |
| 3 | Heathrow | London | 2020-01-02 | 14:00:00 |
| 4 | Lennon Airport | Liverpool | 2020-01-02 | 16:00:00 |
| 5 | Port of Liverpool | Liverpool | 2020-01-02 | 19:30:00 |
| 6 | Port of Liverpool | Liverpool | 2020-01-03 | 07:00:00 |
| 7 | Port of Liverpool | Liverpool | 2020-01-04 | 07:00:00 |
| 8 | Port of Liverpool | Liverpool | 2020-01-05 | 07:00:00 |
| 9 | Port of Liverpool | Liverpool | 2020-01-06 | 07:00:00 |
| 10 | Manchester Airport | Manchester | 2020-01-06 | 12:40:00 |
| 11 | Heathrow | London | 2020-01-06 | 14:40:00 |
------ -------------------- ------------ ------------ ----------
11 rows in set (0.001 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> SELECT * FROM T WHERE CITY = 'LONDON' GROUP BY CITY;
------ --------------- -------- ------------ ----------
| id | venue | city | date | time |
------ --------------- -------- ------------ ----------
| 1 | Waldorf Hotel | London | 2020-01-01 | 07:00:00 |
------ --------------- -------- ------------ ----------
1 row in set (0.001 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> SELECT COUNT(*)
-> FROM T
-> WHERE CITY = 'LONDON'
-> GROUP BY CITY;
----------
| COUNT(*) |
----------
| 4 |
----------
1 row in set (0.001 sec)
Группа по без агрегирующей функции вернет 1 строку неопределенных значений
группа с помощью агрегирующей функции, но без столбца для агрегирования, вернет количество строк, отфильтрованных с помощью предложения where.
Ответ №2:
В вашем запросе есть GROUP BY
. Таким образом, COUNT(*)
это возвращаемое значение в одной строке. Было бы понятнее, если бы запрос агрегации использовал:
SELECT change_request.cr_project_id, COUNT(*)
С помощью GROUP BY
и SELECT *
запрос неверно сформирован и должен возвращать синтаксическую ошибку. К сожалению, более старые версии MySQL допускают этот неработающий синтаксис.
Я не уверен, чего вы действительно хотите, но вы можете просто захотеть удалить GROUP BY
.
Комментарии:
1.
COUNT(*)
результат равен 2, но*
возвращает одну строку.2. @Vickysw . . . Вы упускаете суть. «2» находится в одной строке, сгенерированной
GROUP BY
. Вам нужно удалитьGROUP BY
, если вы хотите увидеть все строки.
Ответ №3:
Если вы хотите подсчитать, сколько записей будет содержать результирующий набор, затем удалите group by
предложение и используйте count(distinct ...)
:
SELECT COUNT(DISTINCT change_request.cr_project_id) cnt
FROM change_request
INNER JOIN task_main_management ON cr_project_id = project_id
LEFT JOIN all_module AS am ON am.m_id = task_m_id
WHERE
cr_tenent_id = '100'
AND cr_entity_id = '100'
AND cr_project_id = 'PROJ_310820200746367254'
AND cr_type = '2'
AND change_request.cr_id = '16'
AND task_main_management.cr_id = 'CHRQ_020920200807413904'
Обратите внимание, что для вашего текущего group by
предложения использование select *
нарушено. Вы должны перечислять столбцы в SELECT
предложении и, возможно, использовать агрегированные функции для всего, что не поступает из таблицы change_request
.
Комментарии:
1. Спасибо за ответ. Я понял ваши мысли, но для общего количества count это моя общая функция в моей структуре.. Есть ли какой-либо другой способ
*
получения правильного результата?