我有一张桌子'表'具有以下结构
ID LinkedWith
12 13
13 12
14 13
15 14
16 0
17 0
18 21
我们会给出一个ID" 12" (或者可能是15),有了它,我们必须获取所有其他相关的ID。
这里12链接到13,14链接到13,15连接到14,依此类推。在我们的例子中,有4个间接相关的ID,可能有很多。 例如,在上述情况下,我们需要IDS 12,13,14,15的最终结果。
我有这个不完整的功能,但无法进一步思考。我知道我们可能需要递归函数但不知道该怎么做
function testFetchRelated($id){
$arrayIDs = array($id);
try{
$dbh = new PDOConfig("db_test");
$stmt = $dbh->prepare("SELECT * FROM table WHERE ID='".$id."' OR LinkedWith='".$id."'");
$stmt->execute();
if($stmt->rowCount()>0){
$fetch = $stmt->fetchAll(PDO::FETCH_OBJ);
foreach($fetch as $f){
if($f->LinkedWith>0){
array_push($arrayIDs, $f->LinkedWith);
}
if($f->ID!=$id){
array_push($arrayIDs, $f->ID);
}
}
}else{
}
$stmt = null;
$dbh = null;
return $arrayIDs;
}catch(PDOException $e){
echo "AN ERROR OCCURRED: ".$e->getMessage();
}
任何人都可以帮我这个
答案 0 :(得分:1)
我已经敲了这个似乎在MySQL程序中做你想要的东西: -
DELIMITER ;;
DROP PROCEDURE IF EXISTS `find_relations`;;
CREATE PROCEDURE `find_relations`(IN_id INT)
BEGIN
CREATE TABLE ids_tmp
(
ID INT(11),
PRIMARY KEY (ID)
);
INSERT INTO ids_tmp
SELECT a.ID FROM some_table a WHERE a.LinkedWith = IN_id
UNION
SELECT a.LinkedWith FROM some_table a WHERE a.ID = IN_id
UNION
SELECT a.LinkedWith FROM some_table a WHERE a.LinkedWith = IN_id
UNION
SELECT a.ID FROM some_table a WHERE a.ID = IN_id;
WHILE (ROW_COUNT() > 0) DO
INSERT INTO ids_tmp
SELECT a.ID FROM some_table a
INNER JOIN ids_tmp b ON a.LinkedWith = b.ID
LEFT OUTER JOIN ids_tmp c ON a.ID = c.ID
WHERE c.ID IS NULL
UNION
SELECT a.ID FROM some_table a
INNER JOIN ids_tmp b ON a.ID = b.ID
LEFT OUTER JOIN ids_tmp c ON a.LinkedWith = c.ID
WHERE c.ID IS NULL;
END WHILE;
SELECT ID FROM ids_tmp;
DROP TABLE IF EXISTS ids_tmp;
END;;
DELIMITER ;
您可以使用 CALL find_relations(12);
调用它未完全调试它(最好使用临时表,但它依赖于在各种单个查询中多次访问同一个表,MySQL不支持临时表),但希望能给你一些想法
如果您想实际使用它,那么可能需要确保创建的表具有会话唯一的名称。