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