SQL递归(高分,急).

SQL递归(高分,急).,第1张

这个估计PKId是ParentId的父节点吧

给你举个例子,就只用这两个字段吧,其他的也没多大用

PKId ParentId

1 0

2 0

3 1

4 2

5 1

假设数据是我上边这样的

可以假设每个PKId分别为商品大类,就把1的定义为软件吧,2定义为硬件,3为硬盘,4为ps软件,5为主板

这样的话,你就能看出对应关系了吧?

1和2是最高层的,所以无父节点,所以ParentId为0

3和5都是硬件,所以归属为1

4为软件,所以归属为2

这样的好处是减少多次读取其他表里的无用信息,在一定程度上可以提高效率,当然是指数据量大的时候,数据量小的时候基本没什么区别

作用你自己都说了,其实就是实现自我关联

但是这样有一点不好,在自身有主键外键,如果其中的逻辑关系弄的不太清楚的话,很容易出问题,简单来说就是这样了

function sumShuzi(&$tree, &$updateData = array()) {

  $sum = 0;

  // foreach($tree as $key => $item) {  //这句话有毒

  foreach($tree as $key => &$item) {

    if(isset($item['children'])) {

      $oldPshuzi = $tree[$key]['Pshuzi'];

      $tree[$key]['Pshuzi'] = sumShuzi($item['children'], $updateData);

      if($oldPshuzi != $tree[$key]['Pshuzi']) {

        $updateData[$item['id']] = array($tree[$key]['Pshuzi'], $tree[$key]['Pname_ch']);

      }

    }

    $sum += $tree[$key]['Pshuzi'];

  }

  return $sum;

}

$tree = json_decode('[{"id":"1","Pid":"0","Pname_ch":"\u6e20\u9053\u90e8","Pshuzi":"1638000","children":[{"id":"4","Pid":"1","Pname_ch":"\u9500\u552e\u4e8c\u90e8","Pshuzi":"895000","children":[{"id":"13","Pid":"4","Pname_ch":"\u5468\u7ecf\u7406","Pshuzi":"28","children":[{"id":"28","Pid":"13","Pname_ch":"\u6e56\u5357","Pshuzi":"158000"},{"id":"35","Pid":"13","Pname_ch":"\u65b0\u7586","Pshuzi":"19000"}]},{"id":"40","Pid":"4","Pname_ch":"\u9648\u7ecf\u7406","Pshuzi":"5000"}]}]}]', true);

//$tree是具有父子关系的数据树

sumShuzi($tree, $updateData);

foreach ($updateData as $id => $item) {

  $sql = "update your_table set Pshuzi={$item[0]} where id={$id}";

  mysqli_query($db, $sql);    //$db是你的数据库连接结果

}

你的代码没看明白,因为数据库可以索引,不明白数据库查询为什么还要二分查找,数据库的HASH是最快速的搜索,那我就直接回答:可以把$conn放在变量里面递归,只要不是在递归函数里面再次mysql_connect就不会造成许多连接,至少浪费一点点堆栈空间(内存)。

其次纠正一下:PHP支持全局变量,需要使用global进行申明,例如:

<php

$a=1;

f();

echo $a;

function f(){

global $a;

$a++;

}

>

最后给你说个轻松的,mysql的连接符$conn,其实在所有的mysql函数里面是可以省略的,如果你只有一个连接,这个参数完全可以不用,例如:

<php

mysql_connect('127001','root','123456');

f();

mysql_close();

function f(){

$sql='select ';

$res=mysql_query($sql);//可以正常执行

$row=mysql_fetch_array($res);

mysql_free_result($res);

}

>

不知道你那个查询, 能不能加一个  Row_Number  的处理。

或者有什么  递增的数值在里面的。

如果有的话,  可以参考下面这种处理方式:

测试数据

CREATE TABLE temp (

  year    INT,  

  salary  INT

);

INSERT INTO temp VALUES(2000, 1000);

INSERT INTO temp VALUES(2001, 2000);

INSERT INTO temp VALUES(2002, 3000);

INSERT INTO temp VALUES(2003, 4000);

预期要求结果:

year salary 

2000 1000

2001 3000

2002 6000

2003 10000

 

SELECT  

  year,

  (SELECT SUM(salary) FROM temp  t2  WHERE t2year <= tempyear) AS salary

FROM

  temp;

year salary

2000 1000

2001 3000

2002 6000

2003 10000

跳岛问题是一个经典的计算机科学问题,它可以通过 SQL 语言进行求解。这个问题通常被描述为在二维平面上有若干个点,现在需要从一个点出发,经过所有的点,最后回到起点。这个问题的解法可以使用 SQL 语言中的递归查询来实现。

具体实现时,可以首先创建一个表格,记录每个点之间的距离。然后从任意一个点开始,递归地查询与该点距离最短的下一个点,并将其标记为已访问。当所有点都被访问过后,需要再查询一次从最后一个点到起点的距离,以确保回到了起点。

需要注意的是,跳岛问题是一个 NP 完全问题,因此对于大规模的数据集,求解可能会非常耗时。此外,SQL 语言并不是跳岛问题的最优解法,实际上,使用专门的算法和数据结构会更加高效。

数据库是什么数据库

我先假设你是 Oracle 吧。

CREATE TABLE test_tree (

test_id INT NOT NULL,

pid INT,

test_val VARCHAR(10),

PRIMARY KEY (test_id)

);

INSERT INTO test_tree VALUES(1, NULL, 'NET');

INSERT INTO test_tree VALUES(2, 1, 'C#');

INSERT INTO test_tree VALUES(3, 1, 'J#');

INSERT INTO test_tree VALUES(4, 1, 'ASPNET');

INSERT INTO test_tree VALUES(5, 1, 'VBNET');

INSERT INTO test_tree VALUES(6, NULL, 'J2EE');

INSERT INTO test_tree VALUES(7, 6, 'EJB');

INSERT INTO test_tree VALUES(8, 6, 'Servlet');

INSERT INTO test_tree VALUES(9, 6, 'JSP');

INSERT INTO test_tree VALUES(10, NULL, 'Database');

INSERT INTO test_tree VALUES(11, 10, 'DB2');

INSERT INTO test_tree VALUES(12, 10, 'MySQL');

INSERT INTO test_tree VALUES(13, 10, 'Oracle');

INSERT INTO test_tree VALUES(14, 10, 'SQL Server');

INSERT INTO test_tree VALUES(15, 13, 'PL/SQL');

INSERT INTO test_tree VALUES(16, 15, 'Function');

INSERT INTO test_tree VALUES(17, 15, 'Procedure');

INSERT INTO test_tree VALUES(18, 15, 'Package');

INSERT INTO test_tree VALUES(19, 15, 'Cursor');

INSERT INTO test_tree VALUES(20, 14, 'T-SQL');

使用 START WITH CONNECT BY 语句实现树状查询

通过根节点 向下查询子节点

SELECT

LPAD(' ', 2(LEVEL-1)) || test_val AS test_val

FROM

test_tree

START WITH

test_id IN (1, 6, 10)

CONNECT BY PRIOR test_id = pid;

TEST_VAL

-----------------------------------------------------------

NET

C#

J#

ASPNET

VBNET

J2EE

EJB

Servlet

JSP

Database

DB2

TEST_VAL

-----------------------------------------------------------

MySQL

Oracle

PL/SQL

Function

Procedure

Package

Cursor

SQL Server

T-SQL

20 rows selected

h2数据库递归查不来数据原因如下。

1、可能出现类型不匹配的问题:例如数据库中存储的是int类型的值,前端传递过来的是string类型的值,所以查询不到匹配的数据。

2、还有就是可能存在数据库缓存的问题:这里数据库的二级缓存,即是对数据的crud有影响,每次的crud之后,查询的数据都是从数据库的缓存中获取的数据,不是从数据库中获取的最新的数据。

以上就是关于SQL递归(高分,急).全部的内容,包括:SQL递归(高分,急).、php与mysql表中如何求递归求和汇总、PHP把数据库连接对象放在递归中当参数行么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9307793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存