mysql 查询从 3 个表中获取多个计数值

mysql query to bring multiple count values from 3 tables

我一直在尝试从 mysql 数据库中的 3 个表中获取多个计数值:

个人资料 用户 prof_opt 选项
+------------+ +------------------------+ +-------- ----------+ +----------------------------+
|编号 |姓名 | |编号 |姓名 | id_prof | | id_prof | id_opt | |编号 | parent |姓名 |
+------------+ |------------------------+ +------ ----------+ +----------------------------+
| 1 |开发 | | 1 |用户1 | 1 | | 1 | 100 | | 100 |空 | m1 |
| 2 |管理员 | | 2 |用户2 | 3 | | 1 | 101 | | 101 | 100 | m1_a |
| 3 |基本 | | 3 |用户 3 | 3 | | 1 | 102 | | 102 | 100 | m1_b |
+------------+ +------------------------+ | 1 | 200 | | 200 |空 |平方米 |
| 1 | 201 | | 201 | 200 | m2_a |
| 1 | 202 | | 202 | 200 | m2_a |
| 1 | 300 | | 300 |空 |立方米 |
| 1 | 301 | | 301 | 300 | m3_a |
| 3 | 300 | | 302 | 300 | m2_b |
| 3 | 301 | +----------------------------+
&nbs; | 3 | 302 |
+--------------------+

Table 选项具有动态构建带有选项和子选项的用户菜单的数据,我没有包含包含文件名的列 url,例如:

- maintainers.php
-users.php
-profiles.php

想法是得到:

配置文件列表、每个配置文件的用户和每个配置文件的选项数量

此查询获取个人资料和用户数量:

SELECT p.id, p.name, count(u.id_prof) AS nr_users
FROM profile p LEFT JOIN user u ON p.id = u.id_prof
GROUP BY p.id

另一个查询得到 配置文件和每个配置文件的选项数量....

SELECT p.id, p.name, count(po.id_prof) AS nr_users
FROM profile p LEFT JOIN prof_opt po ON p.id = po.id_prof
GROUP BY p.id

但是如何将两个结果混合到一个查询中呢??

我试过了,但对每个配置文件的选项数量不起作用:

SELECT p.id, p.name, count(u.id_prof) AS nr_users, count(po.id_prof) AS nr_options
FROM profile p 
LEFT JOIN user u ON p.id = u.id_prof
LEFT JOIN prof_opt po ON u.id = po.id_prof
GROUP BY p.id, u.id_prof

我正在尝试获取:

|编号 |名字 | nr_users | nr_options |
| 1 |开发 | 1 | 8 |
| 2 |管理员 | 0 | 0 |
| 3 |基本 | 2 | 3 |

任何人都可以 post 获得预期结果的查询,或者指出我的查询遗漏或错误的地方吗?

谢谢!

一种选择是使用依赖子查询来获取计数:

SELECT 
p.id,
p.name,
(SELECT COUNT(id) FROM user WHERE id_prof = p.id) as nr_users,
(SELECT COUNT(id) FROM prof_opt WHERE id_prof = p.id) as nr_options
FROM profile p
GROUP p.id

根据我的经验,依赖子查询的性能还算不错,而且通常比执行多个查询要快。我没有分析证据来验证我对它们性能的陈述,但我认为它们工作得很好。

SELECT 
  p.id, 
  p.name,
  u.u_count,
  o.opt_count
FROM  profile
LEFT JOIN (
  SELECT id_prof,
     COUNT(id) u_count
  FROM user
  GROUP BY id_prof
) u
ON p.id = u.prof_id
LEFT JOIN (
  SELECT id_prof,
     COUNT(id) opt_count
  FROM prof_opt
  GROUP BY id_prof
) o
ON p.id = o.prof_id

试试这个

SELECT p.id, p.name, count(u.id_prof) AS 
nr_users, count(po.id_prof) AS nr_options
FROM profile p ,prof_opt po , user u    where p.id = u.id_prof and u.id = po.id_prof
GROUP BY p.id, u.id_prof