【问题标题】:mysql select query result wrong with COUNT(*) and *mysql 选择查询结果与 COUNT(*) 和 * 错误
【发布时间】:2020-12-21 12:33:42
【问题描述】:

在 Mysql 中,我在 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 * from ... group by change_request.cr_projectid 这样的作品
  • @jainvikram444 查询与问题中提到的相同。更改仅具有选择字段 *count(*)

标签: mysql sql select group-by 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)

没有聚合函数的 group by 将返回 1 行不确定的值 具有聚合函数但没有要聚合的列的 group by 将返回由 where 子句过滤的行的计数。

【讨论】:

    【解决方案2】:

    您的查询有一个GROUP BY。因此,COUNT(*) 是返回的 one 行中的值。如果使用聚合查询会更清楚:

    SELECT change_request.cr_project_id, COUNT(*)
    

    使用GROUP BYSELECT *,查询格式错误,应返回语法错误。不幸的是,旧版本的 MySQL 允许这种损坏的语法。

    我不确定您真正想要什么,但您可能只是想删除 GROUP BY

    【讨论】:

    • COUNT(*) 结果为 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 的任何内容使用聚合函数。

    【讨论】:

    • 感谢您的回复。我理解你的想法但是计数的总数是我结构中的常用函数。有没有其他方法可以使用* 获得正确的结果?
    猜你喜欢
    • 2012-11-30
    • 2017-12-15
    • 2012-04-13
    • 1970-01-01
    • 2011-09-14
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多