Исключение строки в базе данных с помощью != в запросе PDO

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

Я пытаюсь исключить определенные строки с помощью запроса PDO, но он не возвращает правильное значение, и я не вижу своей ошибки, может быть, кто-то из вас может мне помочь.

Это первый запрос, который работает.

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

Теперь я хочу исключить chatid ‘s, которые я получаю из этого запроса.

 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>';
  }
}
  

Комментарии:

1. Вы не исключаете с помощью PD, PDO здесь не имеет значения. Вы просто исключаете с помощью самого запроса. Если у вас есть массив данных, вы можете использовать WHERE chatid NOT IN(:chatid)

2. Если вы выполните a GROUP BY chatid , вы не сможете получить повторение одного и того же идентификатора чата дважды. Я чувствую, что вы не делитесь всей историей.

3. Я не понимаю, есть массив с 2 элементами, которые вы хотите исключить, а в вашем запросе только 1 chatid != :chatid . Как вы связываете свои переменные? И вам, вероятно, нужно chatid NOT IN (.., ..) .

4. Я использую bindParam для привязки переменных.

Ответ №1:

Измените запрос на catid НЕ В (xxxx, xxxx).

Комментарии:

1. По-прежнему дает те же результаты, что и раньше.

Ответ №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 with prepared statement. Обычно вы можете избежать их с JOIN помощью .


$objGetSendChat = ...

При использовании $getSendChat в foreach .

Поэтому я чувствую, что нам не хватает некоторого кода, который содержит ошибку.

Кроме того, вы выполняете a GROUP BY chatid и получаете 44495 в результате дважды, поэтому результат не может быть результатом запроса.

Комментарии:

1. Я просто выполняю выборку.

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

3. Наличие дважды одного и того же значения из GROUP BY столбца означает, что результат не совпадает с результатом запроса, поэтому вам следует отредактировать свой вопрос и показать весь код.

4. Обновлен мой первоначальный комментарий.

5. Теперь это лучше. Каждый раз, когда вы запускаете свой запрос в foreach , вы получите ВСЕ строки, КРОМЕ текущей, отсюда и ваши результаты.