一起添加2个数组表

时间:2018-05-07 01:12:31

标签: php mysql pdo

我试图从我的网站获取所有用户状态。 这是我的桌子 enter image description here

如果我添加其他用户,我的用户名将被添加到user1中 如果其他用户添加了我,则会在user1中添加用户名并将其添加到user2

所以我需要尝试从user1获取所有id并且user2被接受为1

我喜欢这样

$id = $_SESSION['user_id'] ;
$yes = '1';
     $query = $db2->prepare("SELECT * FROM friend_requests WHERE (user1='".$id."' OR user2='".$id."') AND accepted = '".$yes."'");
    $query->execute();
 foreach ($query as $row) {
        print $row['user1'] . "\t";
        print $row['user2'] . "\t";

    }

但现在我有$ row [' user2']和$ row [' user1']有没有办法将这些放在一起?所以我可以简单地做一个pdo循环选择状态是id = that?

我试图获取所有状态为id = $ row [&#39; user1&#39;]或$ row [&#39; user2&#39;]但我不想使用或在我的pdo选择中。< / p>

2 个答案:

答案 0 :(得分:1)

您可以按如下方式编辑SQL:

"SELECT id, (CASE WHEN user1 = $id THEN user2 ELSE user1 END) as user, time FROM friend_requests WHERE (user1 = $id OR user2 = $id) AND accepted = 1"

这将仅返回ID为$ ID的用户的已接受朋友。

这里的概念证明:http://www.sqlfiddle.com/#!9/e0b337/2

编辑:正如已经指出的那样,您应该绑定参数以防止SQL注入,但这不在您的问题范围内。

编辑2 :根据下面的第二个问题,您可以执行两个循环,或者如果表相对于可用内存较小,则可以按如下方式执行fetchAll()。

$id = $_SESSION['user_id'] ;
$query = $db2->prepare("SELECT (CASE WHEN user1 = :userid THEN user2 ELSE user1 END) as user FROM friend_requests WHERE (user1 = :userid OR user2 = :userid) AND accepted = 1");
$query->bindParam(':userid', $id, PDO::PARAM_INT);
$query->execute();
$friends = $query->fetchAll(PDO::FETCH_ASSOC);
$friends[] = array('user'=>$id);
foreach ($friends as $k=>$friend) {
    echo $friend . "\t";
}

答案 1 :(得分:0)

您可以使用UNION

<?php

$id = $_SESSION['user_id'] ;
$yes = '1';
$query = $db2->prepare("SELECT id,user2 AS `user` FROM `friend_requests` WHERE user1=:user1 AND accepted={$yes} UNION SELECT id,user1 AS `user` FROM `friend_requests` WHERE user2=:user2 AND accepted={$yes}");
$query->bindParam(':user1', $id, PDO::PARAM_INT);
$query->bindParam(':user2', $id, PDO::PARAM_INT);

$query->execute();
foreach ($query as $row) {
    print $row['user'] . "\t";
}

示例:sqlfiddle