在 PDO 查询中使用 != 排除数据库中的行

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

我正在尝试使用 PDO 查询排除某些行,但它没有返回正确的值,而且我没有看到我的错误,也许你们中的一些人可以帮助我。

这是第一个有效的查询。

$objGetRecievedChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE recieverid = :recieverid GROUP BY chatid');

现在我想排除从该查询中获得的

chatid

foreach ($getRecievedChatFtch as $chatid) {
 echo $chatid['chatid'] . '<BR>';
}

当我回显上述内容时,我得到下一个结果:

20920
81586

哪个是正确的我想排除这两个值,因此我执行下一个查询:

  $objGetSendChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE ownerid = :ownerid AND chatid != :chatid GROUP BY chatid');

foreach ($getSendChat as $key ) {
 echo $key['chatid'] . '<BR>';
}

但是当我回显上面的内容时,我得到了下一个值

44495
20920
44495

这个值

44495
是正确的,尽管我只需要它一次(这就是为什么我
GROUP BY chatid
)但是值
20920
是我需要排除的值之一。

有人知道我做错了什么吗?

提前致谢!

完整代码:

//Voor de berichten die je hebt ontvangen.
$objGetRecievedChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE recieverid = :recieverid GROUP BY chatid');
$objGetRecievedChat->bindParam('recieverid', $member_id);
$objGetRecievedChat->execute();

$getRecievedChatFtch = $objGetRecievedChat->fetchAll(PDO::FETCH_ASSOC);

//Dit is voor verzonden berichten.
foreach ($getRecievedChatFtch as $chatid) {
  echo $chatid['chatid'] . '<BR>';

  $objGetSendChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE ownerid = :ownerid AND chatid NOT IN(:chatid) GROUP BY chatid');
  $objGetSendChat->bindParam('ownerid', $member_id);
  $objGetSendChat->bindParam('chatid', $chatid['chatid']);

  $objGetSendChat->execute();
  $getSendChat = $objGetSendChat->fetchAll(PDO::FETCH_ASSOC);

  foreach ($getSendChat as $key) {
    echo $key['chatid'] . '<BR>';
  }
}
php mysql pdo
2个回答
1
投票

将查询更改为 catid NOT IN (xxxx,xxxx)。


1
投票

您犯了错误:在 foreach 循环中,您检索除当前行之外的所有行。您必须将查询放在

foreach
之外并使用
WHERE IN

//Voor de berichten die je hebt ontvangen.
$objGetRecievedChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE recieverid = :recieverid GROUP BY chatid');
$objGetRecievedChat->bindParam('recieverid', $member_id);
$objGetRecievedChat->execute();

$getRecievedChatFtch = $objGetRecievedChat->fetchAll(PDO::FETCH_ASSOC);

//Dit is voor verzonden berichten.
$chatids = array();
foreach ($getRecievedChatFtch as $chatid) {
  echo $chatid['chatid'] . '<BR>';
  $chatids = $chatid['chatid'];
}

$placeholders = implode(',', array_fill('?', count($chatids)));
$objGetSendChat = $objDatabaseMessages->prepare('SELECT * FROM messages WHERE ownerid = ? AND chatid NOT IN(' . $placeholders . ') GROUP BY chatid');

$objGetSendChat->execute(array_merge(array($ownerid, $chatids)));
$getSendChat = $objGetSendChat->fetchAll(PDO::FETCH_ASSOC);

foreach ($getSendChat as $key) {
  echo $key['chatid'] . '<BR>';
}

或多或少(因为我不喜欢将

WHERE IN
与准备好的语句一起使用。您通常可以使用
JOIN
来避免它们。


$objGetSendChat = ...

当您在

$getSendChat
中使用
foreach
时。

所以我觉得我们在这里缺少一些包含错误的代码。

另外,您执行

GROUP BY chatid
并在结果中获得两次
44495
,因此结果 不能 是查询的结果。

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