2017-07-24 40 views
0

准备语句中的顺序我有一个朋友叫表friends看起来像这样:的mysqli通过

id | user1 | user2 
------------------ 
1 | ab | abc 
2 | ab | abcd 
3 | aa | ab 

如果"ab"和​​是在同一行中就意味着他们是朋友。现在,当用户说"ab"日志中,他将看到他的朋友们的帖子(的'abc''abcd''aa'帖)下面是PHP代码:

session_start(); 
    $name = $_SESSION['username']; //$name=ab; 
    $stmt = mysqli_prepare($link,"SELECT location,postby,pid,likes,time FROM photos WHERE postby=? ORDER BY time"); 
    $query = $link->query("(select user2 from friends where user1='$name')union(select user1 from friends where user2='$name')"); 
while($row=mysqli_fetch_array($query)) { 
    $b = $row['user2']; 
    $stmt->bind_param('s', $b); 
    mysqli_stmt_execute($stmt); 
    $stmt->bind_result($location, $postby,$id,$likes,$time); 
    $stmt->store_result(); 
     while ($stmt->fetch()) { 
      //code to display picture 
     } 
    } 

的问题是,结果是不是真的按时间排序。它会首先显示用户的所有帖子,然后按时间顺序排列该用户的帖子,然后显示另一个用户的帖子,然后按时间排列该用户的帖子,但我想按时间排列所有帖子。我怎样才能做到这一点?

+0

如果你能打印出时间字段,告诉我们您从查询有结果:) –

回答

1

您必须在一个查询中获取好友帖子。

尝试以下操作:

$sql = 'SELECT location, postby, pid, likes, time 
    FROM photos 
    WHERE 
    postby IN (
     SELECT user2 FROM friends where user1=? 
     UNION 
     SELECT user1 FROM friends where user2=? 
    ) 
    ORDER BY time'; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('ss', $name, $name); 
$stmt->execute(); 
+0

嗨,我怎么能在这种情况下使用准备好的语句和绑定参数? – gravition

+0

就像你用其他的mysqli查询一样。我编辑了我的答案。 –

+0

嗨,我得到了“调用成员函数bind_param()布尔值”,这意味着准备好的语句返回false?你是否错过了一个关闭括号或什么?在你的sql – gravition

0

这是因为您的日期查询是在您的每个查询上执行的。因此,首先尝试获取一个用户的所有数据,然后再按日期排序。然后你可以找到其他用户和按时间排序。

如果你用连接编写一个完整的SQL语句,然后statmenet命令,那会更好。

你可以发布整个表,然后我可以给你写一个SQL查询,它可以根据用户进行连接并按时间排序。

由于这是M:M的表格,您可以发布数据库设计的整个图片。或者至少是处于关系中的表格。

+0

你的意思是你想看到的“照片”表的设计? – gravition

1

问题是您在单独的查询中获取结果。

您应该查询所有想要显示来自('ab','abc','abcd'和'aa'的案例的帖子)的用户标识符,然后执行一个查询以获取所有帖子和订单那结果。

$stmt = mysqli_prepare($link,"SELECT location,postby,pid,likes,time FROM photos WHERE postby IN (?) ORDER BY time");