Исключение строки в базе данных с!= В запросе PDO
Я пытаюсь исключить определенные строки с помощью запроса 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>';
}
}
2 ответа
Вы делаете это неправильно: в цикле 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
дважды в результате, поэтому результат не может быть равен запросу.