0 0

SQL,根据分组ID,查询该分组下的所有分组以及分组下的分组40

描述:一张分组表   为简化问题,只列出核心字段:
    id:分组ID,
    name:分组名称;
    parentID : 父分组的ID

问题是:能不能通过SQL,对于指定的分组,查出下面所有的分组(包括分组下的分组)。

希望的效果:比如分组1下面有分组2和分组3,分组2下面还有分组4,现在给定分组1的ID,希望查询出来的结果包括分组2,分组3,以及分组4。

问题补充:感谢大家的回复。我再补充几点:
1、希望方案通用化,不依赖指定类型的数据库;
2、感谢jinnianshilongnian的回复,但是表结构已经定了,无法切换到您的方案。
3、删除分组的问题,大家可以暂不考虑,在删除分组前,业务上会有校验,必须先将分组下的内容清空。
2013年4月10日 17:23

5个答案 按时间排序 按投票排序

0 0

采纳的答案

这个问题是个历史悠久的问题。

从结论说,想一句SQL文是搞不定。特别是楼主还不想依赖DB。
(大多数是DB里写函数的。)


如果需求只是列出根节点的所有子孙节点的话,简易的解决方案是表上再加个RootID的字段。


如果DB根本不让动,或者需求是从任意节点起的话,就只能程序里再循环了。

1. 服务器端程序里面循环。
2. 客户端JS异步请求。

这两种。
为了效率,可以一次取两层。类似


...
    where id = {param} or parentID = {param}

2013年4月11日 13:55
0 0

想通用就必须修改表结构,如2楼所建议的那样(一次改动,到处通用),并不是所有的数据库都支持树状查询,当然通过存储过程也可以实现树状查询,如mysql可以这么做:http://zyn010101.iteye.com/blog/1161361,但效率会随着数据量的增长迅速下降。

2013年4月11日 11:06
0 0

无限极分类。
id  name  parent_id
1    xxx     null
2    aaa        1
3     bbbb      1
4    cccc       2
5     dddd      4


大概就是找寻1的时候 2345 都查询来吧。那就是这个。
但是像你说的1删除了?  有外键不能直接删除啊。必须子全删掉啊,

2013年4月11日 10:04
0 0

建议你改下策略 使用如

  `id`         bigint not null auto_increment,
  `parent_id` bigint,
  `parent_ids`  varchar(200) default '',

parent_ids 存储所有父路径

id  parent_id  parent_ids
1   0          0/
2   1          0/1/
3   1          0/1/
4   3          0/1/3/

如查1下的 可以使用 0/1/%查询  跨数据库 

如果oracle 楼上的即可

2013年4月10日 18:07
0 0

Oracle吗?select * from table  start with id= 1 connect by prior  id = parentID ;

2013年4月10日 17:33

相关推荐

    SQL Server分组排序取数据的实现

    在SQL Server中,分组和排序是数据处理的两个关键操作。它们可以帮助我们对大量数据进行聚合、组织和筛选,以便更好地分析和理解数据。本文将深入探讨如何在SQL Server中实现分组排序并获取每组的特定行数据。 首先...

    sql2000分组统计

    在SQL Server 2000中,分组统计是一个核心的查询功能,它允许数据库管理员和开发者对数据进行聚合操作,以获取特定字段的汇总信息。分组统计通常涉及GROUP BY语句,配合COUNT(), SUM(), AVG(), MAX() 和 MIN()等聚合...

    分组计算[按时间]通用[sql分组;C#分组]

    #### SQL分组计算 SQL中的`GROUP BY`子句用于结合聚合函数(如`SUM()`, `AVG()`, `MAX()`, `MIN()`等),对结果集按照一个或多个列进行分组。这使得我们可以对每一组执行聚合操作,从而获得更有意义的数据视图。 #...

    pb通过sql语句实现分组小计统计

    比如,计算每个`STOCK_ID`下按`TYPE_CD`分类的总价值占该`STOCK_ID`所有类型总价值的百分比。这通常涉及到子查询或窗口函数(如`OVER()`)来实现。 假设我们需要计算上文SQL查询结果中每个`STOCK_ID`的总价值占其...

    第十一章连接查询和分组查询.zip

    在SQL(结构化查询语言)中,连接查询和分组查询是两个非常重要的概念,用于处理和分析数据库中的数据。本章将详细讲解这两个概念及其应用。 首先,我们来看连接查询。连接查询允许我们将多个表的数据结合在一起,...

    C# 2008 数据库分组条件查询代码

    在C# 2008中,数据库分组条件查询是数据处理中常见的操作,它允许我们根据一个或多个字段对查询结果进行分类,并可以计算每个组的聚合函数,如求和、平均值等。本篇文章将深入探讨如何在C# 2008中实现这一功能,以及...

    SQL实验:使用分组,排序和聚合函数以及连接查询

    本次实验旨在帮助学生通过实践加深对SQL语言的理解,特别是关于分组、排序、聚合函数以及连接查询等关键概念的应用。具体包括: 1. **掌握通配符的用法**:通配符在SQL中用于模糊匹配字符串,如`%`和`_`。 2. **...

    分组聚合查询SQL语句练习.docx

    在数据库管理中,SQL(Structured Query ...掌握这些SQL分组聚合查询技巧,对于理解数据库原理基础以及在实际工作中进行数据处理至关重要。通过不断的练习和应用,你将能够熟练地运用这些概念来解决复杂的数据库问题。

    sql数据分组

    为了实现上述的目标,我们需要设计一个SQL查询或存储过程来完成数据分组的任务。下面将详细介绍具体的实现步骤。 #### 三、创建测试数据表 首先,我们需要创建一个测试数据表,并填充相应的数据。根据题目中的描述...

    SQLserver 实现分组统计查询(按月、小时分组)

    在SQL Server中,分组统计查询是数据分析和报表制作中常用的一种技术,它允许我们根据一个或多个字段对数据进行汇总。在这个例子中,我们将探讨如何按照月和小时对访问记录进行分组统计。 首先,我们需要创建一个...

    分组字符合并SQL语句 按某字段合并字符串之一(简单合并)

    标题:按某字段合并字符串之一(简单合并) 描述:将如下形式的数据按id字段合并value字段。...1、sql2000中只能用自定义的函数解决 create table tb(id int, value varchar(10)) insert into tb values(1,

    查询重复数据sql语句

    - `WHERE (id IN (SELECT id FROM a AS a1 GROUP BY id HAVING (COUNT(1) >= 2)))`:这一行是在外部查询中添加一个条件,即只选择那些`id`出现在内部查询结果中的记录。 ### SQL查询重复数据的其他方法 除了上述...

    查询(多表查询,嵌套查询,分组查询)

    根据给定的关系模式和SQL查询语句,我们可以深入地探讨多表查询、嵌套查询以及分组查询等数据库操作中的关键技术点。 ### 关系模式分析 #### 职员表 (Emp) - **主码**: `eid` (唯一标识每个员工) - **属性**: - `...

    SQL语句-递归查询、分组、统计.pdf

    在SQL中,递归查询、分组和统计是三个重要的概念,它们分别用于处理层级数据、数据聚合和复杂的数据分析。 1. **递归查询**: 递归查询主要用于处理具有层级关系的数据,例如组织结构、目录树等。在Oracle数据库中...

    SQL经典查询语句,sql查询语句,sql常用查询语句

    根据给定的信息,我们可以整理出一系列关于SQL的基本操作与高级查询技术的知识点: ### SQL基础知识 #### 创建数据库 - **语法**: `CREATE DATABASE database-name;` - **示例**: 创建一个名为`example_db`的...

    用SQL实现统计报表中的小计与合计的方法详解

    在循环内部,我们根据当前分组的zcxt值从#TB中选择所有记录,并将它们插入到#TB1中。同时,我们也会插入一条计算后的"小计"记录,其中包含了分组内各项的总和。 对于"合计",我们可以在循环之外,使用一次聚合查询...

    SQL 必知必会 10 - 分组数据1

    在本篇文章中,我们将深入探讨SQL的分组数据功能,包括数据分组、创建分组、过滤分组、分组与排序以及SELECT子句的顺序。 10.1 数据分组: 数据分组是通过对数据库中的数据进行分类,以生成聚合统计信息。例如,...

    T-SQL高级查询

    查询id大于2的数据,并完成运算后的结果进行分组和排序 select count(*), (sex * id) new from student where id > 2 group by sex * id order by sex * id; --group by all 所有分组 按照年龄分组,是所有的年龄 ...

    sql复杂查询例子大全

    这些查询通常涉及多个表的联合、子查询、分组、排序、聚合函数以及更复杂的逻辑操作。以下是一些常见的复杂SQL查询示例,旨在帮助你理解和掌握其核心概念。 1. **联接查询**: - 内连接(INNER JOIN):返回两个表...

Global site tag (gtag.js) - Google Analytics