使用Group By进行while循环仅导致一行

时间:2018-11-03 09:01:14

标签: php mysqli while-loop group-by

此查询在phpMyAdmin中产生预期的4行(见下图):

      $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;

enter image description here

如果我在php网站中循环搜索结果,则只能从phpMyAdmin获取结果表的最后一行作为输出。

$nachrichten_liste

您知道为什么$nachrichten_liste不包含表格中的所有行吗?我希望以上图片中的所有消息都包含在$list_messages = $mysqli->prepare("SELECT message_text FROM messages WHERE send_from = ? OR send_to = ? GROUP BY property_id");

更新

如果我将GROUP BY运算符“ property_id”直接放在准备好的语句中,则它会起作用

D1=CONCATENATE(A1,":",B1,":",C1)

1 个答案:

答案 0 :(得分:2)

当您将值"property_id"绑定为文字而不是列名时,您正在尝试按字面量GROUP BY(无论如何都不能这样做)。这意味着它将按照始终相同的方式进行分组,并且所有行均位于1组中。您必须将变量包括在语句中,例如...

  $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