Dans Mysql, j'ai le nombre total d'enregistrements pour la pagination à l'aide de la fonction d'agrégation COUNT () et pour l'affichage des données que j'utilise * au lieu de COUNT () mais j'ai obtenu le nombre total différent et le nombre de retour de rangée.

Requête 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

Il a le résultat de retour 2.

Mais quand j'ai utilisé * au lieu de COUNT (*) dans la sélection, cela m'a donné une seule ligne.

0
Vickysw 2 sept. 2020 à 13:41

3 réponses

Meilleure réponse

Il s'agit d'un comportement attendu .. étant donné

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)

Un groupe par sans fonction d'agrégation renverra 1 ligne de valeurs non déterminées par un groupe avec une fonction d'agrégation, mais aucune colonne sur laquelle agréger ne retournera un décompte pour les lignes filtrées par la clause where.

0
P.Salmon 2 sept. 2020 à 11:44

Si vous souhaitez compter le nombre d'enregistrements que le jeu de résultats contiendra, supprimez la clause group by et utilisez 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'

Notez que, pour votre clause group by actuelle, l'utilisation de select * est interrompue. Vous devriez énumérer les colonnes dans la clause SELECT, et éventuellement utiliser des fonctions d'agrégation sur tout ce qui ne provient pas de la table change_request.

0
GMB 2 sept. 2020 à 10:43

Votre requête comporte un GROUP BY. Ainsi, COUNT(*) est la valeur de la ligne one renvoyée. Ce serait plus clair si la requête d'agrégation utilisait:

SELECT change_request.cr_project_id, COUNT(*)

Avec GROUP BY et SELECT *, la requête est mal formée et doit renvoyer une erreur de syntaxe. Malheureusement, les anciennes versions de MySQL autorisent cette syntaxe cassée.

Je ne suis pas sûr de ce que vous voulez vraiment, mais vous voudrez peut-être simplement supprimer GROUP BY.

0
Gordon Linoff 2 sept. 2020 à 10:43