【MySQL】多表联合查询(新增查询字段、参数设置)

所罗门王说:没有智慧解决不了的问题。


SELECT * from tb_corporation_and_user      人员所在团队 (`user_id`, `corporation_id` ,  `role_id` )
 
SELECT * from tb_corporation                团队描述 (`id` ,`name` ,`logo_url`,`user_id` ,`access_type`,`desc`,)

SELECT * from tb_project         项目描述(`id` ,`name` ,`introduction`,`workspace_mode` ,`project_data` ,`group_id`,)

SELECT * from tb_project_and_user        人员所在项目(`project_id` ,`user_id`,`access_level` )

******************************************************************************************************

--两表左连接+子查询(一个人所在的项目名和团队名)

SELECT
	p.id, p.`name` project, u.user_id 
FROM
	tb_project p
LEFT JOIN tb_project_and_user u 
ON p.id = u.project_id
WHERE u.user_id IN ( SELECT  id FROM tb_user WHERE account = '[email protected]' ); #注意这里的in和=的用法

******************************************************************************************************

--三表左连接查询(一个人所在的项目名和团队名)

SELECT * FROM
	( tb_user u LEFT JOIN tb_project_and_user pu ON u.id = pu.user_id )
LEFT JOIN tb_project p ON p.id = pu.project_id
WHERE u.account = '[email protected]'

******************************************************************************************************

-- 查询出一个人所在的团队和所参加的项目

SELECT
	u.id, u.account, u.`name`,c.`name` team, p.`name` project
FROM
	(
		(
			(
				tb_user u
				LEFT JOIN tb_project_and_user pu ON u.id = pu.user_id
			)
			LEFT JOIN tb_project p ON pu.project_id = p.id
		)
		LEFT JOIN tb_corporation_and_user cu ON u.id = cu.user_id
	)
LEFT JOIN tb_corporation c ON c.id = cu.corporation_id
WHERE
	u.account = "[email protected]"
******************************************************************************************************

-- 为结果集增加一个序号字段,并倒叙查询出项目超过3个的人,

set @i = 0;   # 设置变量并初始化
SELECT
  (@i := @i + 1) as ord_num, u.id, u.account, u.`name`, c.`name` team, p.`name` project
FROM
	(
		(
			(
				tb_user u
				LEFT JOIN tb_project_and_user pu ON u.id = pu.user_id
			)
			LEFT JOIN tb_project p ON pu.project_id = p.id
		)
		LEFT JOIN tb_corporation_and_user cu ON u.id = cu.user_id
	)
LEFT JOIN tb_corporation c ON c.id = cu.corporation_id
GROUP BY u.id                 # 如果要where条件,记得放在group by的前面
HAVING COUNT(project) > 3     # 注意having中聚合函数的含义(AVG() 返回某列的平均值、COUNT() 返回某列的行数、MAX() 返回某列的最大值、MIN() 返回某列的最小值、SUM() 返回某个列之和)
ORDER BY ord_num DESC         # 倒叙排列
******************************************************************************************************

-- 指定人添加到指定项目上(使用了参数)

set @user_id = (SELECT id from tb_user WHERE tb_user.account = "[email protected]");
set @pro_id = (SELECT id from tb_project WHERE tb_project.`name` = "test");
INSERT INTO `hb_rap`.`tb_project_and_user` (
	`project_id`,
	`user_id`,
	`access_level`
)
VALUES
	(@pro_id, @user_id , '1');
******************************************************************************************************
总结:sql语句的编写过程中,需要注意我们依赖那张表作为主要数据,在整个数据集合中使用where进行主要条件筛选,然后having进行第二次筛选(可以使用聚合函数);group by分组和order by排序的关键字的位子也要注意.

猜你喜欢

转载自blog.csdn.net/u013948858/article/details/79417925