2016-12-03 4 views
2

従業員のテーブルを1つ作成し、すべての従業員が他のユーザーと接続しているため、親のユーザーを知るためにparentUserIdフィールドを作成しました。ここで親のユーザーIDから最初のレベルのユーザーレコードを検索する方法

は、私のテーブルのスクリーンショットです:

enter image description here

今、私はちょうどので、SELECTクエリで最初のユーザー・レコードを取得する方法を取得していないPHP & MySQLを学び始めました。たとえば、私がStephen Lopezユーザーの場合、誰がすべての接続ユーザーの最初のユーザーであるかを知りたいと思います。

enter image description here

私はPhyllis Hintonユーザーを見つけようとしています。 SQL問合せで可能か、forループをPHPで作成する必要がありますか?

+0

知っていますか?そうであれば、一定数の結合を行い、答えを得ることができます。これ以外にも、あなたは再帰的クエリを求めていると思います。はい、これもPHPから処理することができますが、私はそれが一番良い方法だとは思いません。 –

+0

これに続く - http://stackoverflow.com/questions/31168675/how-to-mak-a-recursive-self-join-in-mysqlまたはthis - http://stackoverflow.com/questions/8104187/hierarchical- queries-in-mysql –

答えて

1

PHPとmysqlから始まる人物として、あなたが望むものを得るための完全なコード例がここにあります。ここには魔法のSQLはありませんが、PHPループ(カウントリミッター付き)は、DBに接続の親を尋ねる繰り返しです。

<?php 

/* setup your database information */ 
$host = 'localhost'; 
$user = 'db_username'; 
$pass = 'db_password'; 
$db = 'db_name'; 

$link= mysqli_connect($host,$user,$pass,$db); // connect to the database 
if (mysqli_connect_errno()) {     // if fail connection... exit. 
    die(mysqli_connect_error()); 
} 

/* the function to locate the first user in the chain of connections */ 
function find_first_user($link,$first,$last,$max_count=10){ 
    $cnt=0; // local counter as prtection to never go over the $max_count 
    $parent=0; 
    $tbl='myTableName'; 

    // find info about the person in question via the first & last name 
    $q="select parentUserId from $tbl where firstName='" . mysqli_real_escape_string($link, $first) . 
     "' and lastName='" . mysqli_real_escape_string($link, $last) . "'"; 
    if($res=mysqli_query($link, $q)){ 
     list($parent)=mysqli_fetch_row($res); 
    } 
    // if we found a parentId, repeat looking in the chain of connections 
    while($parent && ++$cnt<$max_count){ 
     $q="select parentUserId,firstName,lastName from $tbl where userId=".intval($parent); 
     if($res=mysqli_query($link, $q)){ 
      list($parent,$first,$last)=mysqli_fetch_row($res); 
     } 
    } 
    return "$first $last"; 
} 

// example usage 
print find_first_user($link,'Stephen','Lopez') . "\n"; 
?> 
+0

私はあなたのコードを試して、完璧に働いていますが、私には1つの質問があります。 '$ max_count = 10'の使い方は?あなたは私のことを説明してください。名前で検索するのではなく、ユーザーIDで検索したいのですが? –

+0

max_countを関数に送ることができます。そうでなければ、デフォルト値は10です。DBの設定が間違っている(例:親が自分自身を指している)場合や、接続チェーンが長すぎる場合や、 makeには時間がかかりすぎる。 idで検索するには、関数に少し変更する必要があります。まず、IDを送信する必要があります(ユーザー/パスではありません)。次に、最初のクエリを変更する必要があります。 IDでルックアップするには、 "人に関する情報を見つける..."と書かれたもの。 –

+0

たとえば、1000人から5000人のユーザーがいる場合、$ max_countを更新する必要がありますか? –

0

私はあなたがユーザーレベルの最大深さを知っている場合は、例えば5このクエリを使用することができると思うが深い最大です:あなたは深いユーザーがいかに多くのレベル

SELECT 
user.firstName, 
parent.firstName AS parent_firstName, 
super_parent.firstName AS super_parent_firstName, 
s_super_parent.firstName AS s_super_parent_firstName, 
s2_super_parent.firstName AS s2_super_parent_firstName, 
FROM 
    `user` 
LEFT OUTER JOIN user AS parent ON parent.id = user.parentuserId 
LEFT OUTER JOIN user AS super_parent ON super_parent.id =  parent.parentuserId 
LEFT OUTER JOIN user AS s_super_parent ON s_super_parent.id = super_parent.parentuserId 
LEFT OUTER JOIN user AS s2_super_parent ON s2_super_parent.id = s_super_parent.parentuserId 
関連する問題