Цикл while с Group By приводит только к одной строке - PullRequest
0 голосов
/ 03 ноября 2018

Результатом этого запроса являются ожидаемые 4 строки (см. Изображение ниже) в phpMyAdmin:

SELECT * FROM messages WHERE send_from = 65 OR send_to = 65 GROUP BY `property_id`

enter image description here

Если я зациклюсь на результатах на моем php-сайте, я получу только последнюю строку таблицы результатов из phpMyAdmin в качестве вывода.

      $property_id_text = "property_id";
  $list_messages = $mysqli->prepare("SELECT message_text FROM messages WHERE send_from = ? OR send_to = ? GROUP BY ?");
  $list_messages->bind_param("sss", $user_id, $user_id, $property_id_text);
  $list_messages->execute();
  $list_result = $list_messages->get_result();


  if ($list_result):
      if(mysqli_num_rows($list_result)>0):
          while($list_message = $list_result->fetch_assoc()):

            $nachrichten_liste = $nachrichten_liste . '<div>' . $list_message['message_text'] . '</div>';

            endwhile;
      endif;
  endif;

Есть идеи, почему $nachrichten_liste не содержит все строки таблицы? Я ожидаю, что все сообщения с вышеупомянутого изображения содержатся в $nachrichten_liste

UPDATE

Если я добавлю оператор GROUP BY "property_id" прямо в подготовленный оператор, он будет работать

$list_messages = $mysqli->prepare("SELECT message_text FROM messages WHERE send_from = ? OR send_to = ? GROUP BY property_id");

1 Ответ

0 голосов
/ 03 ноября 2018

Вы пытаетесь GROUP BY литерала, связывая значение "property_id" как литерал, а не как имя столбца (что вы не можете сделать в любом случае). Это означает, что он группировался по чему-то, что всегда было одинаковым, и все строки были в одной группе. Вы должны будете включить переменную в оператор как ...

  $property_id_text = "property_id";
  $list_messages = $mysqli->prepare("SELECT message_text 
                               FROM messages 
                               WHERE send_from = ? OR send_to = ? 
                               GROUP BY $property_id_text");
  $list_messages->bind_param("ss", $user_id, $user_id);

Что не рекомендуется, если вы не знаете, $property_id_text не будет потенциальным источником внедрения SQL.

У вас также должна быть какая-то агрегатная функция для message_text, чтобы она знала, какой она должна быть (даже если они одинаковые). Прочитайте https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html.

...