一个复杂的关系多表关系检索,请大侠指导

chilli6519 2017-12-25 09:31:10
场景:
有一个学习记录表 A 记录了 学习的用户编号 和 学习的内容编号
table a ( userid , lecid )

有一个表 B 记录了 用户的分类情况,包含用户编号和 分类编号
table b (userid , qid)

有一个表 c 记录了 用户和 其他用户的关联关系表, 包括 用户编号 和 被关联的用户编号
table c (userid , ruid )

现在希望 通过 表 b 中 分类编号 qid , 检索出 表 b 中 所有的 userid 以及 和 表 b 中检索出的 userid 关联的 表 c 中 ruid 在 表 a 中的 学习记录



谢谢
...全文
282 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2017-12-28
  • 打赏
  • 举报
回复

SELECT a.*
FROM a, (
	SELECT b.userid FROM b WHERE b.qid = 2
	UNION
	SELECT c.ruid FROM b, c WHERE b.qid = 2 AND b.userid = c.userid
)x WHERE x.userid = a.userid
chilli6519 2017-12-28
  • 打赏
  • 举报
回复
引用 7 楼 zjcxc 的回复:
如果输入表 b 的qid = 2, 希望得到的表 a 输出是 1,1 1,2 1,3 2,1 5,1 //因为 1 关联着 5 5,2 ----------------------------------------- 1 关联着 5 是通过 1,2 1,5 的关系? 如果是的话,那么 表 b 的qid = 2, 对应的有两个 userid table b (userid , qid) 1,2 2,2 ---> 为什么你找了 1 的关联,没有去找 2 的关联?
抱歉,确实弄错了, 如果 qid = 2 的话,结果 1,1 1,2 1,3 2,1 5,1 //因为 1 关联着 5 5,2 3,2 //因为 2 关联编号 3 3,4 就是需要这种结果,谢谢
zjcxc 2017-12-28
  • 打赏
  • 举报
回复
如果输入表 b 的qid = 2, 希望得到的表 a 输出是 1,1 1,2 1,3 2,1 5,1 //因为 1 关联着 5 5,2 ----------------------------------------- 1 关联着 5 是通过 1,2 1,5 的关系? 如果是的话,那么 表 b 的qid = 2, 对应的有两个 userid table b (userid , qid) 1,2 2,2 ---> 为什么你找了 1 的关联,没有去找 2 的关联?
chilli6519 2017-12-28
  • 打赏
  • 举报
回复
引用 4 楼 zjcxc 的回复:
提供测试数据和要的结果
第一个inner join 没有问题,是限制分类中的人 第二个 应该是加入 分类中的人 关联的所有人的学习情况, 用inner 的话,不仅没有关联更多的人
chilli6519 2017-12-28
  • 打赏
  • 举报
回复
抱歉,头两天外出了,
引用 4 楼 zjcxc 的回复:
提供测试数据和要的结果
有一个学习记录表 A 记录了 学习的用户编号 和 学习的内容编号 table a ( userid , lecid ) 1,1 1,2 1,3 2,1 3,2 3,4 4,1 4,3 5,1 5,2 有一个表 B 记录了 用户的分类情况,包含用户编号和 分类编号 table b (userid , qid) 1,2 2,2 3,1 4,3 有一个表 c 记录了 用户和 其他用户的关联关系表, 包括 用户编号 和 被关联的用户编号 table c (userid , ruid ) 1,2 1,5 2,3 3,1 如果输入表 b 的qid = 2, 希望得到的表 a 输出是 1,1 1,2 1,3 2,1 5,1 //因为 1 关联着 5 5,2 如果输入 qid = 3 3,2 3,4 1,1 //因为 3 关联着 1 1,2 1,3
zjcxc 2017-12-28
  • 打赏
  • 举报
回复
别名写掉了
SELECT a.* IFNULL(d.name, '本人') as name
FROM(
    SELECT a.*
    FROM a, (
        SELECT b.userid FROM b WHERE b.qid = 2
        UNION
        SELECT c.ruid FROM b, c WHERE b.qid = 2 AND b.userid = c.userid
    )x WHERE x.userid = a.userid
) a LEFT JOIN d ON d.rxh  = a.userid
chilli6519 2017-12-28
  • 打赏
  • 举报
回复
Error Code: 1248. Every derived table must have its own alias 0.000 sec 以上语句执行错误
zjcxc 2017-12-28
  • 打赏
  • 举报
回复
SELECT a.* IFNULL(d.name, '本人') as name
FROM(
	SELECT a.*
	FROM a, (
		SELECT b.userid FROM b WHERE b.qid = 2
		UNION
		SELECT c.ruid FROM b, c WHERE b.qid = 2 AND b.userid = c.userid
	)x WHERE x.userid = a.userid
) LEFT JOIN d ON d.rxh  = a.userid
chilli6519 2017-12-28
  • 打赏
  • 举报
回复

SELECT a.*
FROM a, x.rname (
    SELECT b.userid, '' as rname FROM b WHERE b.qid = 2
    UNION
    SELECT c.ruid , e.rname  FROM b, c ,d  WHERE b.qid = 2 AND b.userid = c.userid and d.rxh = c.rxh
)x WHERE x.userid = a.userid

可这样得到的 rname 全部为空 ‘’
chilli6519 2017-12-28
  • 打赏
  • 举报
回复
没有关联的直接缺省为 ‘本人’
chilli6519 2017-12-28
  • 打赏
  • 举报
回复
引用 9 楼 zjcxc 的回复:

SELECT a.*
FROM a, (
	SELECT b.userid FROM b WHERE b.qid = 2
	UNION
	SELECT c.ruid FROM b, c WHERE b.qid = 2 AND b.userid = c.userid
)x WHERE x.userid = a.userid
测试了这个应该没有问题了, 但关联到实际项目的时候,还有些问题, 有一个表 c 记录了 用户和 其他用户的关联关系表, 包括 用户编号 和 被关联的用户编号 , 这个关系还有一个关系名称,而这里面保存了名称序号 table c (userid , ruid , rxh) 1,2 , 1 1,5 , 2 2,3 , 2 3,1 , 3 表 d 是对应的序号表 rxh rname 1 经理 2 老板 3 组长 最后通过分类 qid = 1 能够得到上面那些数据外, 还希望得到被检索的对应人 名称 谢谢
zjcxc 2017-12-26
  • 打赏
  • 举报
回复
提供测试数据和要的结果
chilli6519 2017-12-26
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
SELECT
	b.oid, a.*
FROM b		-- 现在希望 通过 表 b 中 分类编号  qid , 检索出 表 b 中 所有的 userid 
	INNER JOIN c ON b.userid=c.userid		--- 以及 和 表 b 中检索出的  userid 关联的  表 c 
	INNER JOIN a ON c.ruid = a.userid		-- 中 ruid	 在 表 a 中的 学习记录
表b 中的分类条件 qid 条件赋值:


SELECT
	b.oid, a.*
FROM b		-- 现在希望 通过 表 b 中 分类编号  qid , 检索出 表 b 中 所有的 userid 
	INNER JOIN c ON b.userid=c.userid		--- 以及 和 表 b 中检索出的  userid 关联的  表 c 
	INNER JOIN a ON c.ruid = a.userid		-- 中 ruid	 在 表 a 中的 学习记录
where b.qid = ?

这个结果不是我希望得到的 我希望的最终数据是 所有表 b 中的人, 以及表 b 中人 相 关联的表 c 中的人的 所有在 表 a 中的学习记录
zjcxc 2017-12-26
  • 打赏
  • 举报
回复
SELECT
	b.oid, a.*
FROM b		-- 现在希望 通过 表 b 中 分类编号  qid , 检索出 表 b 中 所有的 userid 
	INNER JOIN c ON b.userid=c.userid		--- 以及 和 表 b 中检索出的  userid 关联的  表 c 
	INNER JOIN a ON c.ruid = a.userid		-- 中 ruid	 在 表 a 中的 学习记录
wandier 2017-12-26
  • 打赏
  • 举报
回复
select b.userid,a.lceid from table a,table b,table c where b.qid = 查询的 qid and b.userid = c.userid and c.userid = a.userid

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧