mysql 建表问题,如何让查询能一层一层叠上去

2014-12-25 20:54:54 +08:00
 MaiCong

是这样的,最近做一套会员系统,其中有两个字段当前用户和推荐人。

我需要列出当前推荐人的所有父级推荐人

比如:

当前用户->推荐人->推荐人的推荐人->推荐人的推荐人的推荐人->推荐人的推荐人的推荐人的推荐人...

这样一直叠上去,请问数据库表该怎么写?

我总不能:

$ref1 ='select * form `user` where refname = 'xxx' limit 1;
$ref2 = select * form `user` where refname = '$ref1' limit 1;
$ref3 = select * form `user` where refname = '$ref2' limit 1;
...

求写法!:(

4443 次点击
所在节点    MySQL
27 条回复
abelyao
2014-12-25 21:24:59 +08:00
可以考虑使用 存储过程 在数据库里面用 while
MaiCong
2014-12-25 21:32:03 +08:00
@abelyao 呃⊙﹏⊙怎么弄
abelyao
2014-12-25 21:36:54 +08:00
@MaiCong 搜一下 mysql 存储过程
xudshen
2014-12-25 21:39:38 +08:00
bcxx
2014-12-25 21:42:07 +08:00
试试 closure table? 应该那几个 tree 表的 antipattern 可解……
txlty
2014-12-25 21:42:24 +08:00
如果是我做,就直接加个字段。每次插入数据时查询一次就够了。
zenliver
2014-12-25 21:43:53 +08:00
这样,,性能会成渣渣
abelyao
2014-12-25 21:47:36 +08:00
@txlty 加个什么样的字段呢?
msg7086
2014-12-25 21:57:58 +08:00
$people = 'xxx'
$ref = []
while 还有$people
$people ='select * form `user` where refname = '$people' limit 1;
$ref[] = $people
txlty
2014-12-25 21:58:38 +08:00
@abelyao
字段 [username] [refname] [当前推荐人的所有父级推荐人]
数据: xxx . . ref1 . . ref3,ref2,ref1
新增用户xxx2,推荐人xxx
数据:xxx2 . . xxx . . ref3,ref2,ref1,xxx
Nerrsoft
2014-12-25 22:00:52 +08:00
性能堪忧啊,如果用户不怎么多的话可以一次查询所有用户,然后在程序中循环出结果
toooddchen
2014-12-25 22:06:51 +08:00
用一个char字段, 用分隔符把推荐人串起来,

id1-id2-id3-id4

使用的时候把它取出来, 在应用里拆分查询就ok
MaiCong
2014-12-25 22:11:29 +08:00
@txlty 这就是追加了?每次新增前查询推荐人信息,然后在推荐人字段里追加所属推荐人的推荐人。。
这个方法简单。感谢!
abelyao
2014-12-25 22:22:10 +08:00
@txlty @MaiCong
……好吧,确实简单又实用,就是字段的长度不能预测,就用 text 来存储吧,就是如果要检索用户 A 带来的所有下级用户,有点麻烦而已
Aoliz
2014-12-25 22:31:07 +08:00
果然还是以空间换时间哈~
实际需求里,佣金系统应该不需要这么多级吧
Cee
2014-12-25 22:43:10 +08:00
存储过程
了解一下嵌套子查询 邻接模型 物化路径模型 嵌套集合模型
可以去看看 The Art of SQL
wingoo
2014-12-25 22:47:26 +08:00
以前做多层菜单时有个方案
增加冗余列
内容类似/root/child/childchild
这样的好处是可以找到某个root下的所有子菜单用like '/root/%'
后果是更新稍微麻烦些
MaiCong
2014-12-25 23:00:48 +08:00
@xudshen 有点明白了。
@bcxx get√
@txlty 看楼下...
@zenliver 所有才问嘛
@msg7086 用 while 真的大丈夫?
@Nerrsoft 刚开始这样查询的时候我可吓了一跳...
@Aoliz 嘿嘿,发下线呗
@abelyao 用电脑了,看了一下,还是这个靠谱。
@Cee 嗯,正在看,看来得恶补一下知识了。
MaiCong
2014-12-25 23:09:05 +08:00
@wingoo 数据大了影响很大啊 这招行不通啊
markmx
2014-12-25 23:11:01 +08:00
有个什么二叉树 看看行不行

记得有个 left ,right 值。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/156712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX