这个估计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把数据库连接对象放在递归中当参数行么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)