请教一个SQL语句改怎么写

yaomingxyzsssssaq 2012-10-07 05:46:22
我有这样一个需求,一个分类表type ,最基本包含3个字段,
id
pid 父ID
name

还有个产品表 product
id
typeID
name

分类表可以无限分类,就是一个分类下可以包含多个子分类,子分类还可以包含子分类,级数不限

产品表里的记录的typeID只能包含type表里叶子节点的ID,即没有子分类的记录的ID

现在的需求是,根据一个分类ID,查到所有属于此分类和其子分类 以及子分类的子分类 以此类推。。。直到包含所有叶子节点 的产品,请问 SQL语句改怎么写呢?

可以在这2个表里添加合适的辅助字段。
...全文
233 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaomingxyzsssssaq 2012-10-09
  • 打赏
  • 举报
回复
还有一个问题

一个表里有两个字段都是TIME类型的,starttime 和endtime

用什么方法或函数 能判断当前时间在starttime 和endtime之间

比如 starttime 3:00:00 endtime是5:30:00

可以select * from table1 where Curtime() between starttime and endtime;

但是 要是我的起始和结束时间段跨越24点钟 就不行了 比如从晚上22点到凌晨2点

比如 starttime 22:00:00 endtime是2:00:00

当前时间如果是在晚上22点和凌晨2点之间 结果是不能查到

怎么解决呢?


yaomingxyzsssssaq 2012-10-09
  • 打赏
  • 举报
回复
我试着采用一楼的方法 可是不行啊

比如我的一级分类
亚洲 001
北美洲 002


二级
中国 001001
日本 001002


美国 002001
加拿大 002002

产品表里 一个产品属于属于日本,一个属于美国
001002 日本
002001 美国

现在查产品表,查北美洲的 LIKE 002

这样不是吧俩产品都查到了吗
宁波朱超 2012-10-08
  • 打赏
  • 举报
回复
1楼的方法是最常用的方法。
huaye 2012-10-08
  • 打赏
  • 举报
回复
你觉得数据多的话,把你刚开始有几个顶级分类就建几个表,这样的话就不用全表扫描了。
结婚兔 2012-10-08
  • 打赏
  • 举报
回复
1楼的方法很不错的
yufenghua 2012-10-08
  • 打赏
  • 举报
回复
分类表可以无限分类..这个本身就是好无语的需求。另 支持一楼。
cscript 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

我的实际需求没说完整,还有的要求是:根据一个分类ID,查到所有属于此分类和其子分类 以及子分类的子分类 以此类推。。。直到包含所有叶子节点 的产品 并且 根据产品表中的一个字段比如sorted字段降序排序 且只取前20条记录

另外,一个大分类下所有叶子节点总数可能有几千个,


按照2楼的方法,假如加一个辅助字段level,内容就是001,001002等,大概实现的SQL语句应该是(……
[/Quote]

我怎么觉得递归还不如like呢

1楼方法很好
yaomingxyzsssssaq 2012-10-08
  • 打赏
  • 举报
回复
我的实际需求没说完整,还有的要求是:根据一个分类ID,查到所有属于此分类和其子分类 以及子分类的子分类 以此类推。。。直到包含所有叶子节点 的产品 并且 根据产品表中的一个字段比如sorted字段降序排序 且只取前20条记录

另外,一个大分类下所有叶子节点总数可能有几千个,


按照2楼的方法,假如加一个辅助字段level,内容就是001,001002等,大概实现的SQL语句应该是(语法可能不对,大概这个意思)

SELECT * FROM product WHERE typeId IN (SELECT id from type WHERE level LIKE %001%) ORDER BY sorted LIMITED 20 DESC

这样可以实现需求,不过,用LIKE性能可能会影响较大,TYPE表里总共大约按10000条记录,每次请求就要遍历一遍,一天几万的页面浏览量,没测试过 ,还有这里的IN后面括号里会查到几千个ID,这样的话,性能不知道如何 及MYSQL对IN中的条目限制




另一种是递归, 这个分2种方法,

一个是递归到一个叶子节点 就用此叶子节点的ID去查一下,全部递归完 合并查到的记录结果,但这样就没办法按sorted字段降序排序 且只取前20条记录了



还有一种是先递归得到所有叶子节点的ID,假如是个idList
然后查询的SQL大概是这样

SELECT * FROM product WHERE typeId IN (.....) ORDER BY sorted LIMITED 20 DESC

这样可以实现功能,不过
这里的IN 后括号中的内容,需要程序把idList中所有ID转为字符串,用逗号分隔,
这种方法的问题除了上面提到的-----这里的IN后面括号里会查到几千个ID,这样的话,性能不知道如何 及MYSQL对IN中的条目限制,这个疑问

还有
这个SQL语句从程序发送给MYSQL实际可能有几千字节长,因为这里的IN后括号内的内容是先用程序查出来 拼装好再发送给MYSQL的, 感觉SQL语句太长了, (第一个SQL语句中 IN后面括号里的内容是MYSQL内部现查现用的,所以程序发送给MYSQL的SQL语句就是看到的那么几十个字节长)



不知道我理解的对不对?





NoTargetException 2012-10-07
  • 打赏
  • 举报
回复
这些可以用程序来控制啊!
递归查询就可以,如果要将所有信息保存下来就用Map<Object, List<Object>>这样递归保存就可以。
如果只是查产品,将最后叶子节点的id保存下来,再去查产品表。
asia_deng 2012-10-07
  • 打赏
  • 举报
回复
根据一个分类ID,查到所有属于此分类和其子分类 以及子分类的子分类 以此类推

递归吧
huaye 2012-10-07
  • 打赏
  • 举报
回复
按你这样说的话,可以改成这样:
顶级节点
001
子节点
001001
001002
001003
子节点
001001001
001001002
明白了吧!添加的话就这样添加,查找时用like就可以了

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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