mysql выбирает результат запроса неправильно с COUNT(*) и *

#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 это моя общая функция в моей структуре.. Есть ли какой-либо другой способ * получения правильного результата?