消除foreach中的重复ID

时间:2014-08-22 14:39:36

标签: php mysqli foreach

我很难从我的php foreach中删除重复项。我出于某种原因无法让它工作。

我要做的是如下:人们可以推荐其他人关注特定用户。如果两个人推荐了同一个人,则有两个db条目,其中包含该特定用户的用户名。

我已经有一个登录用户的建议页面。我通过foreach向用户展示。由于该特定人员有两个数据库条目,因此该用户显示了两次。这就是为什么我想要消除重复并向每个用户展示一次,无论有多少人推荐那个人。

我已经尝试了我能想到的一切。甚至array_unique也不会为我做这个技巧,但那是因为我正在将数组与变量进行比较。但我真的不知道如何做到这一点,否则......

这是我的代码的一部分

//Get info about users recommendations and put them into an array
$prepare_user_info = array(); 
$get_user_info = mysqli_query($mysqli,"SELECT * FROM recommend WHERE rec_by_id = '$user_id' ORDER BY timestamp DESC") OR die (mysqli_error($mysqli));

while($prepared_user = mysqli_fetch_array($get_user_info)){
$prepared_user = array( 
    "rec_id" => $prepared_user['rec_id']);
    $prepare_user_info[] = $prepared_user;
}


//Foreach every recommendation by the logged in user
foreach ($prepare_user_info as $pu):

    //Get the recommendations user_data_array
    $stmt = $mysqli->prepare("SELECT user_lookup_array FROM recommend WHERE rec_id = ?") or die (mysqli_error($mysqli));
    $stmt->bind_param('s', $pu['rec_id']); 
    $stmt->execute();  
    $stmt->bind_result($db_user_data_array); 
    $stmt->store_result();
    $stmt->fetch();
    $fetch_array = $stmt->num_rows;
    $stmt->close();

    //Decode the user_data_array
    $user = json_decode($db_user_data_array);

    //Echo the name of the user
    echo $user->name;

endforeach;

有没有办法消除重复项,因此无论登录用户推荐该人多少次,每个用户只会显示一次?

提前致谢!

修改

我已将我的第一段代码改为(谢谢@Mike Brant):

$prepare_user_info = array(); 
$get_user_info = mysqli_query($mysqli,"SELECT DISTINCT rec_id FROM recommend WHERE rec_by_id = '$user_id' ORDER BY timestamp DESC") OR die (mysqli_error($mysqli));

while($prepared_user = mysqli_fetch_array($get_user_info)){
$prepared_user = array( 
    "rec_id" => $prepared_user['rec_id']);
    $prepare_user_info[] = $prepared_user;
}

副本消失了,人们只出现一次。但是,仍有一个问题。为什么我不准备在foreach内?我需要每个用户的user_lookup_array。因此我把它放在了foreach里面。

谢谢!

3 个答案:

答案 0 :(得分:0)

我不了解执行这些多个查询的必要性。看起来您可以通过将表连接到自身来简单地查询单个查询所需的所有数据。这可能是这样的:

SELECT DISTINCT b.rec_id, b.user_lookup_array
FROM recommend AS a
INNER JOIN recommend AS b
  ON a.rec_by_id = b.rec_id
WHERE a.rec_by_id = ?

在这样的多对多关系表中有额外的数据似乎也很奇怪。这让我想知道你是否有一个有问题的架构。也许你应该在你的问题中添加架构信息。

答案 1 :(得分:0)

根据经验,不要在循环查询结果时执行查询。 如果这就是你正在做的事情(并且确实如此),那就意味着你错过了一个联接。 SQL在创建(php)客户端代码的正确关系方面要快得多。

尝试类似:

SELECT * FROM recommend AS uses_that_is_recomended 
  LEFT JOIN recommend AS user_that_recomended ON user_that_recomended.rec_id=uses_that_is_recomended.rec_by_id

 WHERE uses_that_is_recomended.rec_by_id = ?
  GROUP BY uses_that_is_recomended.rec_by_id, user_that_recomended.rec_id
 ORDER BY timestamp DESC

请检查或给出正确的结果,您可能需要在组中进行一些更改。 但这是要走的路,不要在php中解决这样的问题

答案 2 :(得分:0)

您应该只询问$user_id推荐的用户 - 此处不需要间接查询,因为您想要的所有数据都已与rec_by_id行相关联。

SELECT user_lookup_array
FROM recommend
WHERE rec_by_id = ? ($user_id bind)

然而 user_lookup_array听起来像数据库的坏字段,似乎它重复了很多。您应该构建关联表(另请参阅:多对多关系),其中推荐的用户ID与推荐的用户ID结合,并且所有用户的详细信息都将由这些ID来自JOIN来自单独的表:

用户

user_id | user_name | ...other user details (one per field)
1       | Mark      | ...
2       | Helen     | ...
...     | ...       | ...
142     | John      | ...

推荐

rec_by_id | rec_id
1         | 2
1         | 142
2         | 142

现在您的查询将如下所示:

SELECT users.*
FROM recommend
INNER JOIN users ON users.user_id = recommend.rec_id
WHERE recommend.rec_by_id = $user_id

看起来很复杂,但您应该真正了解如何在一个结果集中JOIN表。它使大量操作更容易,更快(当然也没有重复)

循环中的查询消耗了大量的服务器资源(就像购买一件商品,支付费用以及一次又一次地购买商品一样)。