Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅将以下php转换为SQL_Php_Sql - Fatal编程技术网

仅将以下php转换为SQL

仅将以下php转换为SQL,php,sql,Php,Sql,上面的代码是我为覆盖数据库中重复的参与者而编写的。我相信我在php中尝试做的事情可以通过SQL中的一条语句来完成。我只是不知道从哪里开始。我正在寻找一些关于如何在一条sql语句中实现这一点的指导,并摆脱不必要的foreach()循环来修复这些东西 我试图在sql语句中包含以下条件: 如果ParentID>0,则使用ParentID获取结果 else使用ActorID获取结果 表结构 function fetch_Actor($ActorID){ global $pdo; $s

上面的代码是我为覆盖数据库中重复的参与者而编写的。我相信我在php中尝试做的事情可以通过SQL中的一条语句来完成。我只是不知道从哪里开始。我正在寻找一些关于如何在一条sql语句中实现这一点的指导,并摆脱不必要的
foreach()
循环来修复这些东西

我试图在sql语句中包含以下条件:

  • 如果ParentID>0,则使用ParentID获取结果

  • else使用ActorID获取结果

表结构

function fetch_Actor($ActorID){
    global $pdo;
    $stmt = $pdo->prepare('SELECT * FROM actors WHERE ActorID = ?');
    $stmt->execute([$ActorID]);
    return $stmt->fetch();
}
$actors = fetch_actor($actor['ActorID']);   
foreach ($actors as $actor){
    if($actor['ParentID'] > 0){
    $actor = fetch_actor($actor['ParentID']);
    }
}
如果$ActorID=1,我希望返回的内容

Actors 
ActorID    |    Name    | ParentID
      1    |    Abel    | 0
      2    |    John    | NULL
      3    |    Abel    | 1
如果$ActorID=2,我希望返回的内容

Actors 
ActorID    |    Name    | ParentID
      1    |    Abel    | 0
如果$ActorID=3,我希望返回的内容

Actors 
ActorID    |    Name    | ParentID
      2    |    John    | NULL
我已经试过了,但似乎不起作用:

Actors 
ActorID    |    Name    | ParentID
      1    |    Abel    | 0

可能不太理想,但应该有效:

IF((SELECT ParentID FROM actors WHERE ActorID = ?) > 0) 
 SELECT * FROM actors WHERE ParentID = ? 
ELSE 
 SELECT ParentID FROM actors WHERE ActorID = ?


p、 与代码不同,它不是递归的,但根据注释,它不是必需的。

可能不理想,但应该可以工作:

IF((SELECT ParentID FROM actors WHERE ActorID = ?) > 0) 
 SELECT * FROM actors WHERE ParentID = ? 
ELSE 
 SELECT ParentID FROM actors WHERE ActorID = ?


p、 与代码不同,它不是递归的,但根据注释,它不是必需的。

UNION语句可能最适合于此,正如@mickmackusa所建议的:

SELECT a.* 
FROM actors a 
inner join (SELECT ParentID,ActorID FROM actors WHERE ActorID = ?) q 
on (((q.ParentID = 0 or q.ParentID is Null) and a.ActorID = q.ActorID) 
OR (q.ParentID > 0 and a.ActorID = q.ParentID))

正如@mickmackusa所建议的,工会声明可能最适合这一点:

SELECT a.* 
FROM actors a 
inner join (SELECT ParentID,ActorID FROM actors WHERE ActorID = ?) q 
on (((q.ParentID = 0 or q.ParentID is Null) and a.ActorID = q.ActorID) 
OR (q.ParentID > 0 and a.ActorID = q.ParentID))

这是另一种没有联合限制技术的方法:

SELECT * FROM Actors WHERE ActorID = 1 AND (ParentID = 0 OR ParentID IS NULL)
 UNION 
SELECT * FROM Actors WHERE ActorID = (SELECT ParentID FROM Actors WHERE ActorID = 1)

SELECT*FROM actors,其中(actorid=?和parentid这是另一种没有联合限制技术的方法:

SELECT * FROM Actors WHERE ActorID = 1 AND (ParentID = 0 OR ParentID IS NULL)
 UNION 
SELECT * FROM Actors WHERE ActorID = (SELECT ParentID FROM Actors WHERE ActorID = 1)

SELECT*FROM actors,其中(actorid=?和parentId)我们看不到您的表结构/数据。您只是想建立一个备份值(或默认值)如果缺少一个呢?这样怎么样?@mickmackusa修复了。如果有一长串家长,我们应该遵循它吗?比如:4 Abel 3?从顶部的代码看,答案似乎是肯定的。@Elhana我确保家长仍然是家长。我的场景只有孩子和家长。@shnisaka请消除表dat的歧义a、 这样,当
ActorID
等于
1
3
时(只要给
ActorID
3
一个不同的
名称
值),您的问题就很清楚了,如果您发现我的链接答案“有用”您可能知道该怎么做。我们看不到您的表结构/数据。您只想建立备份值(或默认值)吗如果缺少一个呢?这样怎么样?@mickmackusa修复了。如果有一长串家长,我们应该遵循它吗?比如:4 Abel 3?从顶部的代码看,答案似乎是肯定的。@Elhana我确保家长仍然是家长。我的场景只有孩子和家长。@shnisaka请消除表dat的歧义a、 这样,当
ActorID
等于
1
3
时,您的问题就清楚了
Name
(只需给
ActorID
3
一个不同的
Name
值),如果您发现我的链接答案“有用”,您可能知道该怎么做。您的代码工作正常,谢谢!不过我找到了一个更简单的解决方案=)好吧,我不确定mysql是否有类似oracles CONNECT BY的东西。任何适合你的东西:)你的代码都可以,谢谢!不过我发现了一个更简单的解决方案=)嗯,我不确定mysql是否有类似oracles CONNECT BY的功能。对你有用的东西:)