场景:
有一个学习记录表 A 记录了 学习的用户编号 和 学习的内容编号
table a ( userid , lecid )有一个表 B 记录了 用户的分类情况,包含用户编号和 分类编号
table b (userid , qid)有一个表 c 记录了 用户和 其他用户的关联关系表, 包括 用户编号 和 被关联的用户编号
table c (userid , ruid )现在希望 通过 表 b 中 分类编号 qid , 检索出 表 b 中 所有的 userid 以及 和 表 b 中检索出的 userid 关联的 表 c 中 ruid 在 表 a 中的 学习记录谢谢
有一个学习记录表 A 记录了 学习的用户编号 和 学习的内容编号
table a ( userid , lecid )有一个表 B 记录了 用户的分类情况,包含用户编号和 分类编号
table b (userid , qid)有一个表 c 记录了 用户和 其他用户的关联关系表, 包括 用户编号 和 被关联的用户编号
table c (userid , ruid )现在希望 通过 表 b 中 分类编号 qid , 检索出 表 b 中 所有的 userid 以及 和 表 b 中检索出的 userid 关联的 表 c 中 ruid 在 表 a 中的 学习记录谢谢
解决方案 »
- mysql极度奇怪的问题
- 一个关于mysql主从数据库的问题,大家探讨一下
- 我想问下MYSQL的问题
- 数据库多值问题
- 关于存储过程返回日期型的问题。
- MYSQL ODBC MFC CRecordSet 中文乱码为问号,求解!!!
- mysql 中DISTINCT 和limit哪一个先执行呢?
- 散分了,Mysql 临时表问题,100分!
- mysql下有类似sql server的附加数据库的功能吗?或mysql下如何扩展数据库的空间?
- 用MySQL-Front导出的SQL文件怎么才能与网络连接使用使用
- mysql如何统计以关联表中某个字段的所有取值所对应数据记录数,并以另一个字段作为分组条件
- Mysql sql语句优化问题
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 中的学习记录
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
第一个inner join 没有问题,是限制分类中的人第二个 应该是加入 分类中的人 关联的所有人的学习情况, 用inner 的话,不仅没有关联更多的人
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就是需要这种结果,谢谢
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 能够得到上面那些数据外, 还希望得到被检索的对应人 名称
谢谢
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 全部为空 ‘’
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
Error Code: 1248. Every derived table must have its own alias 0.000 sec
以上语句执行错误
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