2016-09-26 56 views
1

是否有可能获得所有可能链接到UserID1的用户?在单个查询中获取所有推荐用户?

例如:

UserID1简称UserID2和UserID5

UserID2简称UserID3

UserID3简称UserID4

结果UserID1页面上:

  • + UserID2
  • + UserID5
  • ++ UserID3
  • +++ UserID4

如何我目前做:

$user_data['id']=1; 
$primary_referral_query=mysqli_query($conn, "SELECT username FROM users WHERE referrer=$user_data[id]"); 
while($primary_referral=mysqli_fetch_array($primary_referral_query)) 
{ 
    echo '+'.$primary_referral['username'].'<br>'; 
} 
$secondary_referral_query=mysqli_query($conn, "SELECT a.username, b.username, c.username AS users_c_username FROM users AS a, users AS b, users AS c WHERE b.referrer = a.id AND a.id <> b.id AND c.referrer = b.id AND a.id=$user_data[id]"); 
while($secondary_referral=mysqli_fetch_array($secondary_referral_query)) 
{ 
    echo '++'.$secondary_referral['users_c_username'].'<br>'; 
} 
+0

什么是你的代码中的结果? – bitWorking

+0

看看[这个问题](http://stackoverflow.com/q/20215744/5459839)。关于如何获取链接到分层表中给定记录的所有后代记录的想法有几个不同的答案。 – trincot

+0

@bitWorking我的代码的结果是我如何显示在我的问题(减去'+++ UserID4',因为我没有做这个循环) – Draven

回答

0

你的存储方法分层数据称为邻接表(模型)。

您有不同的选项:

1)阅读来自数据库中的所有数据把它放在一个PHP阵列和递归遍历它

实施例:https://stackoverflow.com/a/15307555/1948627

2)选择仅当前用户和后代,把它放在一个PHP数组并遍历它递归

的SQL应该像这样:

SELECT u1.username as lev1, u2.username as lev2, u3.username AS as lev3, u4.username AS as lev4 
FROM users AS u1 
LEFT JOIN users AS u2 ON u2.referrer = u1.id 
LEFT JOIN users AS u3 ON u3.referrer = u2.id 
LEFT JOIN users AS u4 ON u4.referrer = u3.id 
WHERE u1.id = 1; 

我没有找到php代码的例子,但它应该更难,因为您收到的数据现在是多余的。另请注意:对于树中的每个新深度,都必须在DB选择中添加一个JOIN。

3)递归PHP/MySQL的

例子:https://stackoverflow.com/a/10994181/1948627

我会选择1去,如果你没有太多的数据。或者更好地选择另一种存储或检索数据的方式。

我最喜欢的方式是Closure Tables

关于嵌套另一个有趣的意见设置:https://stackoverflow.com/a/31642680/1948627