从mysql查询过滤结果

问题描述 投票:0回答:1

我不确定这是MySQL问题还是PHP问题。如果它可以在SQL中解决,那将是首选。

目前我有以下内容:

$sql=$dbh->prepare("SELECT DISTINCT ToUserID, FromUserID FROM Message WHERE Deleted is NULL AND (ToUserID=? OR FromUserID=?)");
$sql->execute(array($_POST['UserID'], $_POST['UserID']));

$messages = $sql->fetchAll();

MySQL查询可能返回如下内容:

{
      "ToUserID" : "1",
      "1" : "2",
      "0" : "1",
      "FromUserID" : "2"
    },
    {
      "ToUserID" : "2",
      "1" : "1",
      "0" : "2",
      "FromUserID" : "1"
    }

我需要的是能够过滤结果,以便上面两个结果只返回一个。即

if (item1.ToUserID == item2.FromUserID) && (item1. FromUserID == item2.toUserID) {
  remove item2
}

另一个例子:

{
      "ToUserID" : "1",
      "1" : "2",
      "0" : "1",
      "FromUserID" : "2"
    },
    {
      "ToUserID" : "2",
      "1" : "1",
      "0" : "2",
      "FromUserID" : "1"
    },
    {
      "ToUserID" : "3",
      "1" : "1",
      "0" : "2",
      "FromUserID" : "1"
    },
    {
      "ToUserID" : "4",
      "1" : "1",
      "0" : "2",
      "FromUserID" : "1"
    },
    {
      "ToUserID" : "4",
      "1" : "1",
      "0" : "2",
      "FromUserID" : "1"
    }

会成为:

{
      "ToUserID" : "1",
      "1" : "2",
      "0" : "1",
      "FromUserID" : "2"
    },
    {
      "ToUserID" : "3",
      "1" : "1",
      "0" : "2",
      "FromUserID" : "1"
    },
    {
      "ToUserID" : "4",
      "1" : "1",
      "0" : "2",
      "FromUserID" : "1"
    }
php mysql
1个回答
1
投票

不相关的是,我会将默认的提取模式更改为PDO_FETCH_ASSOC,这样您就不需要打扰数字键,这只是重复信息。

然后,在这些组合中

 1  2  User1
 2  3  User2
 2  1  User2

你想要消除User2的第二次出现,因为1-2对已经存在。

您可以通过添加两个计算字段在MySQL中执行此操作:

 SELECT ...
 ... IF (user1 < user2, user1, user2) AS oneUser,
 ... IF (user1 < user2, user2, user1) AS anotherUser,
 ...

现在,两行都将两个额外字段设置为“1”和“2”,您可以在这些字段上添加一个明确的约束。

当然你也可以用PHP做到这一点:

 // Array
$seen = [ ];
while ($tuple = $rs->fetch()) {
    $key = $tuple['user1id'] < $tuple['user2id']
         ? "{$tuple['user1id']}:{$tuple['user2id']}"
         : "{$tuple['user2id']}:{$tuple['user1id']}";
    if (in_array($key, $seen)) {
         // Ignore this tuple.
         continue;
    }
    // Add combination to seen list
    $seen[] = $key;

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.