我尝试使用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>';
}
}
答案 0 :(得分: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
两次,因此结果不能成为查询的结果。
答案 1 :(得分:1)
将查询更改为catid NOT IN(xxxx,xxxx)。