我很难获得一个非常简单的存储过程.请考虑以下文章表格片段:
id replaced_by baseID
1 2 0
2 3 0
3 0 0
Run Code Online (Sandbox Code Playgroud)
一个简单的分层表,使用copy-on-write.编辑文章时,当前文章的replacement_by字段将设置为其新副本的ID.
我添加了一个baseID字段,将来应该存储一篇文章的baseID.在上面的例子中,有一篇文章(例如id 3).它的baseID是1.
为了获取baseID,我创建了以下存储过程:
DELIMITER $$
CREATE FUNCTION getBaseID(articleID INT) RETURNS INT
BEGIN
DECLARE x INT;
DECLARE y INT;
SET x = articleID;
sloop:LOOP
SELECT id INTO y FROM article WHERE replaced_by_articleID = x;
IF y IS NOT NULL THEN
SET x = y;
ITERATE sloop;
ELSE
LEAVE sloop;
END IF;
END LOOP;
RETURN x;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
这看起来很简单,直到我实际调用函数使用:
SELECT getBaseID(3);
Run Code Online (Sandbox Code Playgroud)
我希望,函数返回1.我甚至愿意理解它可能需要一秒钟.相反,机器的CPU上升到100%(mysqld).
我甚REPEAT .. UNTIL …
我有一个像这样的数据库:
id text parent
1 Parent 1 0
2 Child of 1 1
3 Sibling 1
4 Another Parent 0
5 A first child 4
Run Code Online (Sandbox Code Playgroud)
所以我试图捕捉一个树形结构,我列出了父母.我知道另一个选项(我认为是嵌套的吗?)但是我现在要坚持这个.我现在正试图将数据从数据库中取出并放入PHP中的嵌套数组结构中.我有这样的功能:
class Data_Manager
{
public $connection = '';
public $collection = array();
function __construct() {
$this->connection = mysql_connect('localhost', 'root', 'root');
$thisTable = mysql_select_db('data');
// error handling truncated
}
function get_all() {
$arr = &$this->collection;
$this->recurseTree('', 0, $arr);
var_dump($arr);
}
function recurseTree($parent, $level, $arrayNode) {
$result = mysql_query('SELECT * FROM tasks WHERE parent="' . $parent . …Run Code Online (Sandbox Code Playgroud)