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
我一直在尝试从 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