MySQL 连接和 COUNT() 多个表

2023-11-22

我试图COUNT()在一个查询中的多个表上,但我无法让它工作。这是我到目前为止所拥有的:

TABLES:

table1
---------------------
id | name
---------------------
 1 | test
 2 | test2


table2
---------------------
id | table1_id
---------------------
 1 | 1
 2 | 1
 3 | 1


table3
---------------------
id | table2_id
---------------------
 1 | 1


table4
---------------------
id | size | table3_id
---------------------
 1 | 1024 | 1
 1 | 200  | 1

SQL:

SELECT
    table1.name,
    COUNT(table2.table1_id) AS table2_count,
    COUNT(table3.table2_id) AS table3_count,
    COUNT(table4.table3_id) AS table4_count,
    SUM(table4.size) AS table4_size
FROM
    table1
LEFT JOIN table2
    ON table1.id = table2.table1_id
LEFT JOIN table3
    ON table2.id = table3.table2_id
LEFT JOIN table4
    ON table3.id = table4.table3_id
WHERE
    table1.id = 1

我从上面的查询得到的结果:

name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test |      4       |      2       |      2       |    1224

我应该得到的结果:

name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test |      3       |      1       |      2       |    1224

您将需要使用DISTINCT,但您还需要计算 ID,而不是外键:

SELECT
    table1.name,
    COUNT(DISTINCT table2.id) AS table2_count,
    COUNT(DISTINCT table3.id) AS table3_count,
    COUNT(DISTINCT table4.id) AS table4_count,
    SUM(table4.size) AS table4_size
FROM table1
LEFT JOIN table2 ON table1.id = table2.table1_id
LEFT JOIN table3 ON table2.id = table3.table2_id
LEFT JOIN table4 ON table3.id = table4.table3_id
WHERE table1.id = 1

这里有一个fiddle.

解释: The DISTINCT关键字消除所有重复值,从而生成唯一值列表。

如果您运行查询时没有COUNT() and SUM(), 你得到:



name  table1_id  table2_id  table3_id  size
test  1          1          1          1024 
test  1          1          1          200 
test  1          (null)     (null)     (null) 
test  1          (null)     (null)     (null) 
  

所以如果你添加COUNT() and SUM(),你显然得到:



name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 
  

然而,使用DISTINCT与您的查询没有帮助,因为您可以清楚地看到重复的值,这将导致:



name  table1_id  table2_id  table3_id  size
test  1          1          1          1224 
  

现在,如果您运行我的查询而不使用COUNT() and SUM(), 你得到:



name  table1_id  table2_id  table3_id  size
test  1          1          1          1024 
test  1          1          2          200 
test  2          (null)     (null)     (null) 
test  3          (null)     (null)     (null) 
  

如果您添加COUNT() and SUM(),您会得到与查询完全相同的结果:



name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 
  

但是,因为这次您有不同的值(即并非全部都是 1),所以现在如果您使用DISTINCT, 你得到:



name  table1_id  table2_id  table3_id  size
test  3          1          2          1224 
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 连接和 COUNT() 多个表 的相关文章

  • 使用非管理员帐户时,SQL Linked Server 返回错误“不存在登录映射”

    我有一个本地 SQL Server 2008R2 我已将链接服务器配置为远程数据库 当我使用 SQL 登录帐户登录本地服务器时 链接服务器工作得很好sysadmin服务器角色 我可以查询远程服务器 因此我知道链接服务器设置是正确的 但是 如
  • 从条件表中获取 WHERE 子句的条件

    我创建了以下简单的DataModel 我用以下数据填充了表格 1 桌子Customer INSERT INTO test customer CustomerName Country RegistrationDate VALUES Custo
  • 如何在数据库中存储世界各地的所有地理位置?

    我在一家旅游网站工作 我需要存储游客去过的旅游景点 我需要位置表中的地点是唯一的 以便我可以知道特定地点的受欢迎程度等 我还需要存储在我身边的所有国家 州 城市 因为我不能依赖用户输入 数据库是MySQL 看到这些位置的可用数据集 我发现存
  • excel vba - 在电子表格上查询

    如果我有这两张表 is there some sort of excel vba code using ADO that could acheive these desired results which could utilise any
  • 使用实体框架的子查询

    我正在移植一个子系统NHibernate to 实体框架并希望了解将以下查询移植到的最佳方法EF var date DateTime Now It can be any day AccountBalanceByDate abbd null
  • MySQL 外键,无法创建表(错误号:150)

    我正在尝试为我的系统构建数据库和表 但我发现如果我不在代码中添加外键 没有错误 我使用了很多方法尝试使代码正常工作 但仍然有错误 我使用的是MySQL 5 5 31 代码如下 创建数据库服务条款 DROP TABLE TOS USER CA
  • 计算唯一组合的数量,无论列顺序如何

    我有两列类别 两列中都显示相同的可能选项 并且我希望计算每个唯一组合的行数 无论每行 A 列或 B 列 中类别的顺序如何 示例数据框 df1 pd DataFrame A dog cat mouse bunny cat mouse dog
  • 如何在多个数据库的表之间移动数据,同时保持外键关系/引用完整性?

    我正在尝试找出将多个数据库中的几个数据表移动 合并到一个数据库中的最佳方法 我有一个类似于以下的架构 CREATE TABLE Products ProductID int IDENTITY 1 1 NOT NULL Name varcha
  • SQL Server 2005 将 VARCHAR 转换为 INT 但默认为无效类型

    我的表中有一个 varchar 100 列 其中包含整数 作为字符串 和非整数字符串的混合 例如 dimension varchar 100 5 17 3 Pyramids Western Bypass 15 我怎样才能写一个表达式 例如将
  • 一张 400GB 表,一个查询 - 需要调优思路 (SQL2005)

    我有一个大表 我想对其进行优化 我正在使用 MS SQL 2005 服务器 我将尝试描述它的使用方式 如果有人有任何建议 我将非常感激 该表约400GB 有1亿行 每天插入100万行 该表有 8 列 1 列数据和 7 列用于查找 排序 k1
  • Codeigniter Cart - 将数据保存在数据库中 - 如何处理?

    我需要帮助在我的网络应用程序中处理订单和购物车 我决定使用 Codeigniter 2 中内置的 Cart 库 我看过一些关于 Cart 库的教程 我知道如何使用它 但我不知道 我什么时候应该在数据库中创建 保存该订单 当用户将商品添加到购
  • SQL仅选择列上具有最大值的行[重复]

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 这个问题在这里已经有答案了 我有这个文件表 这里是简化版本 id rev content 1 1 2 1 1 2 1 3 如何
  • 两个sql查询的性能差异?

    我的表中有一个具有文本数据类型的字段 以下两个sql查询的性能是否有差异 select from tablename where fieldname xyz select from tablename where fieldname zyx
  • 导出数据库的 CREATE 脚本

    假设我已经在 pgAdmin 中创建了一个数据库 但我想导出一个 CREATE sql 文件 我将如何生成转储 以下是如何使用 pgAdmin 创建一个架构脚本 该脚本可以与 PostgreSql 数据库架构比较工具 例如apgdiff h
  • 在 MySQL 中使用 BLOB 或 VARBINARY 加密数据?

    我正在开发一个 PHP 应用程序 它通过文本区域接受用户输入 它将加密存储在数据库中 使用 AES ENCRYPT 我应该使用 BLOB 还是 VARBINARY 字段 这两种类型的字段都会对性能产生影响吗 BLOB 和 VARBINARY
  • 如何使用 DbSession 在 Yii2 中创建用户会话管理系统 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 今天 当我想为我的网站创建用户个人资料页面并希望创建系统用户可以管理他在此系统中的活动会话时 需要 查看活动会话 浏览器和平台 查看当
  • 主键与主键

    创建包含数据库结构的 mysql 转储时 其中一张表显示以下内容 CREATE TABLE completedTransactions paymentId int 10 unsigned NOT NULL timestamp int 15
  • 如何在 JPA/Hibernate 中执行本机 SQL 脚本?

    我有一个带有数据库转储的 SQL 脚本 我如何使用 Hibernate 执行它EntityManager 我这样尝试过 EntityManager manager getEntityManager Query q manager creat
  • MySQL 将 COMMENT 添加到外键

    我正在将旧数据库 SyBase 转换为 MySQL 并且有以下 DDL 查询 ALTER TABLE DBA tab prodotto ADD FOREIGN KEY fkey idlinea tpr idlin REFERENCES DB
  • 比在配置文件中以纯文本形式存储 mysql 密码更好的方法吗?

    许多 PHP 程序要求用户将 mysql 密码以纯文本 字符串或常量 形式存储在应用程序根目录的配置文件中 这一直困扰着我 这么多年过去了 还有更好的方法吗 到目前为止 我已经提出了两个最小的安全提升方案 使用 htaccess 中的规则使

随机推荐