如何将四个不同表中的信息显示为一个表?我有4张桌子
具有相关信息。这些表包含数据包,组织子级和
系统用户数据。我想查询一个组织订阅了哪种类型的软件包,以及该组织下注册了多少个子代和用户。表格中包含的示例数据如下所示。
Packages Table
|-------------------------------|
| package_id | package_name |
--------------------------------|
| 12 | Basic |
| 21 | Pro |
| 33 | Premium |
---------------------------------
Organisations Table
|-------------------------------------------------------|
| org_id | org_name | package_id |
|-------------------------------------------------------|
| 18 | Marks of Awesomeness | 12 |
| 24 | John Hopkins Hospital | 21 |
| 38 | Teddy and the Wailers | 33 |
| 78 | Lawrence Movers | 12 |
|--------------------------------------------------------
Children's Table
|------------------------------------------------|
| id_child | id_org child_name | id_org |
|------------------------------------------------|
| 14 | Mark Walker | 18 |
| 22 | Jane Quinn | 24 |
| 38 | Lily Audrey | 24 |
| 44 | Dona Marie | 18 |
|-------------------------------------------------
Users Table
|------------------------------------------------|
|idu | org_id | fname | lname |
|------------------------------------------------|
|87 | 18 | John | Doe |
|92 | 33 | Jane | Doe |
|107 | 18 | Martin | Short |
|112 | 18 | Jason | Seguel |
|127 | 33 | Josh | Radnor |
|-------------------------------------------------
我的查询如下
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
该查询的问题在于,仅在有孩子和用户的情况下才显示组织
使用其org_id列出。我想列出所有组织的所有数据及其已订阅的软件包名称,
该特定组织列出的儿童总数,下面列出的用户总数
该特定组织,对于没有子组织,用户或两者皆无的组织,则为零。
以下是我想要的结果。谢谢
所需结果
|------------------------------------------------------------------------------------|
| 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 |
--------------------------------------------------------------------------------------
最佳答案
这将完成您想要的工作...您需要将没有所有记录的两个表连接在一起,以便用户和子项...对这些计数进行计数,并使用COALESCE将其取出以处理空值
注意:
您的预期结果不正确...组织表中没有org_id = 33。 Teddy and the Wailers
不应为2,而应为0-或您要将用户中的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 |
+-----------------------+-----------------+-----------------+------------------+