2017-10-21 7 views
0
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']); 
    } 
} 

上記のコードは、私のデータベースの重複アクターを無効にするために書いたものです。私はPHPでやろうとしていることは、SQLの1つのステートメントで行うことができると信じています。私はどこから始めるべきか分かりません。私は1つのSQLステートメントでこれを行う方法についてのいくつかのガイダンスを探していて、不必要なものを修正するために私の不要なforeach()ループを取り除いています。次のPHPをSQLに変換する

私は私のsqlなステートメントでは、この条件を含めるしようとしています

  • のParentID> 0は、その後のParentID

  • アクターID

表を使用して結果をフェッチを使用して結果をフェッチする場合構造

Actors 
ActorID | Name | ParentID 
     1 | Abel | 0 
     2 | John | NULL 
     3 | Abel | 1 
私は私が= 3

$アクターID場合に返されたく何$アクターID = 2

Actors 
ActorID | Name | ParentID 
     2 | John | NULL 

場合に返されたく何$アクターID = 1

Actors 
ActorID | Name | ParentID 
     1 | Abel | 0 

場合に返されたく何

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 = ? 
+0

テーブルの構造やデータが表示されません。欠落している場合はバックアップ値(またはデフォルト値)を設定したいだけですか?このようなものはいかがですか? https://stackoverflow.com/a/34758622/2943403 – mickmackusa

+0

@mickmackusaが修正されました。 – shnisaka

+0

親の長い連鎖がある場合は、それに従うべきですか? 何かのように:4アベル3?上のコードから、答えは「はい」のように見えます。 – Elhana

答えて

1

これは別のUNIONのない方法です - LIMIT技術:

SELECT * FROM actors WHERE (actorid=? AND parentid<1) OR actorid=(SELECT parentid FROM actors WHERE actorid=?) 

SQLFiddle Demo

これは、 LIMITを使用する必要があります。なぜなら、論理的には結果セット内に1つの行しか存在しないからです。

1
おそらく

理想的ではないが、動作するはずです:

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)) 

http://sqlfiddle.com/#!9/a5a228/7

P.S.コードとは異なり、再帰的ではありませんが、コメントには必要ありません。

+0

あなたのコードはありがたくです!私はより簡単な解決策を見つけました=) – shnisaka

+0

mysqlにはORACLE CONNECT BYのようなものがあるかどうかはわかりません。何でもあなたのために働く:) – Elhana

0

@mickmackusaにより示唆されるようにUNION文は、おそらくこのために最高の作品:

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) 

http://sqlfiddle.com/#!9/a5a228/10/0

関連する問題