php - Mysql将4个不同表的信息显示为一个表

标签 php mysql

如何将来自 4 个不同表格的信息显示为一个表格?我有 4 个包含相关信息的表。这些表包含包、组织子项和系统用户数据。我想查询一个组织订阅了什么类型的套餐,以及该组织下注册了多少 child 和用户。表格中包含的示例数据如下所示。

包表:

<表类="s-表"> <头> package_id package_name <正文> 12 基础 21 专业版 33 高级版

组织表:

<表类="s-表"> <头> 组织编号 组织名称 package_id <正文> 18 令人敬畏的标志 12 24 约翰霍普金斯医院 21 38 泰迪和哭泣者 33 78 劳伦斯搬运工 12

child table :

<表类="s-表"> <头> id_child id_org child_name id_org <正文> 14 马克沃克 18 22 简·奎因 24 38 莉莉奥黛丽 24 44 唐娜玛丽 18

用户表:

<表类="s-表"> <头> idu 组织编号 名字 名字 <正文> 87 18 约翰 母鹿 92 33 简 母鹿 107 18 马丁 简短 112 18 贾森 续集 127 33 乔希 拉德诺

我的查询如下图所示:

SELECT SQL_CALC_FOUND_ROWS `id_org`, `org_name`, `package_name`
        ,COUNT(id_child) AS child_count, COUNT(idu) AS user_count FROM organisations,packages,children,system_users
        WHERE organisations.id_org=children.org_id AND organisations.id_org=system_users.org_id
     AND organisations.org_package_id=packages.id_package

查询的问题是它只显示一个组织,如果它有一个 child 和一个用户 使用其 org_id 列出。我想列出所有组织的所有数据及其订阅的包名称, 该特定组织下列出的 child 总数,下面列出的用户总数 该特定组织,对于组织没有 child 、用户或两者的情况,则为零。 以下是我想要的结果。

期望的结果:

<表类="s-表"> <头> 组织 包名 child 数量 用户数 <正文> 令人敬畏的标志 基础 2 3 约翰霍普金斯医院 专业版 2 0 泰迪和哭泣者 高级版 0 2 劳伦斯搬运工 基础 0 0

最佳答案

这会做你想做的......你需要左连接两个不会有你所有记录的表,这样用户和 child ......对这些进行计数并使用 COALESCE 将其拉出以处理空值

注意:

您的预期结果不正确...组织表中没有 org_id = 33。 Teddy and the Wailers 的计数不应为 2,而应为 0——或者您希望将 users 中的 org_id 更改为 38 而不是 33。

查询:

SELECT 
    o.org_name AS 'Organisation', 
    p.package_name as 'Package Name', 
    COALESCE(t.num_children, 0) AS 'No of Children', 
    COALESCE(t1.num_users, 0) AS 'Number of Users'
FROM organisation o
JOIN packages p ON p.package_id = o.package_id
LEFT JOIN 
(   SELECT 
        COUNT(*) as num_children, id_org 
    FROM children 
    GROUP BY id_org
) as t ON t.id_org = o.org_id 
LEFT JOIN 
(   SELECT 
       COUNT(*) as num_users, org_id 
    FROM users 
    GROUP BY org_id
) as t1 ON t1.org_id = o.org_id

DEMO

输出:

+-----------------------+-----------------+-----------------+------------------+
| Organisation          | Package Name    | No of Children  | Number of Users  |
+-----------------------+-----------------+-----------------+------------------+
| Marks of Awesomeness  | Basic           | 2               | 3                |
| John Hopkins Hospital | Pro             | 2               | 0                |
| Teddy and the Wailers | Premium         | 0               | 0                |
| Lawrence Movers       | Basic           | 0               | 0                |
+-----------------------+-----------------+-----------------+------------------+

编辑:

如果您将用户表中的 ID 33 更改为 38 以匹配所需的结果,那么您将得到以下结果:QUERY

输出:

+-----------------------+-----------------+-----------------+------------------+
| Organisation          | Package Name    | No of Children  | Number of Users  |
+-----------------------+-----------------+-----------------+------------------+
| Marks of Awesomeness  | Basic           | 2               | 3                |
| John Hopkins Hospital | Pro             | 2               | 0                |
| Teddy and the Wailers | Premium         | 0               | 2                |
| Lawrence Movers       | Basic           | 0               | 0                |
+-----------------------+-----------------+-----------------+------------------+

关于php - Mysql将4个不同表的信息显示为一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25169912/

相关文章:

php - laravel 5.3 auth 总是重定向到登录页面

php - 确保我在 Laravel 5 中获得了正确的外键语法

mysql - 查询性能;不确定发生了什么

php - 社交网站时间线的数据库查询

php - 如何将 6+31 个数字字符塞入 22 个字母数字字符?

php - 产品数据库结构 : How to store a list of options for each product?

php - 使用 Guzzle 复制远程文件

php - [SQL/PHP]Fieldname为数字,类型为 "int"

php - 使用我的 session 时 MYSQL 查询错误

mysql - "undefined method ` 接受 ' for nil:NilClass"