php-mysql: group by выдает ошибку

#php #mysql #json

#php #mysql #json

Вопрос:

У меня есть таблица сообщений со следующими столбцами: id_message_parent,id_user_from,id_user_to,message,read_date,created,status

Мне нужно выбрать последнее сообщение для пользователя, сгруппированного по id_message_parent , и много пробовал, но весь запрос выдает белую страницу смерти «ошибка сервера 500» или возвращает первое по порядку, а не последнее, как:

     {"messages":[{"id_message":"1","id_message_parent":"1","id_user_from":"1","id_user_to":"2","message":"u0645u0631u062du0628u0627 u0627u0646u0627 u0645u0633u062au062eu062fu0645 1","read_date":null,"created":"2016-10-17 18:13:39","status":"0"}]}

//while it should be
{"messages":[{"id_message":"2","id_message_parent":"1",.....}]}
  

Вот что я пробовал:

 $sql="SELECT *, max(id_message) as max_id FROM `messages` WHERE (`id_user_to`='".$id_user."' OR `id_user_from`='".$id_user."') and `status`='".$status."' GROUP BY `id_message_parent`";

$sql="select * from `messages` where `id_message` in(SELECT *, max(id_message) as max_id FROM `messages` WHERE (`id_user_to`='".$id_user."' OR `id_user_from`='".$id_user."') and `status`='".$status."' GROUP BY `id_message_parent`) x";

$sql="SELECT * FROM `messages` WHERE `id_message` IN (SELECT MAX(id_message) FROM `messages` WHERE (`id_user_to`='".$id_user."' OR `id_user_from`='".$id_user."') and `status`='".$status."') ORDER BY id DESC";

$sql="SELECT * FROM (SELECT * FROM `messages` WHERE `id_user_to`='".$id_user."' OR `id_user_from`='".$id_user."' ORDER BY id DESC) a GROUP BY IF(`id_user_to` = '".$id_user."', `id_user_from`, `id_user_to`)";

$sql="SELECT `id_message`, `id_message_parent`, `id_user_from`, `id_user_to`, `message`, `read_date`, `created`, `status`, GROUP_CONCAT(`id_message`, ',') FROM `messages` GROUP BY `id_message_parent`";
  

и многое другое….
вот функция php

 $result = mysql_query($sql);    
if (mysql_num_rows($result) > 0){   
$messgs=array();
while ($messgs_info= mysql_fetch_array($result)){   
    $info = new Messages();
    $info->id_message=$messgs_info['id_message'];       
    $info->id_message_parent=$messgs_info['id_message_parent'];     
    $info->id_user_from=$messgs_info['id_user_from'];       
    $info->id_user_to=$messgs_info['id_user_to'];   
    $info->message=$messgs_info['message']; 
    $info->read_date=$messgs_info['read_date']; 
    $info->created=$messgs_info['created']; 
    $info->status=$messgs_info['status'];

    array_push($messgs, $info);
}
    echo json_encode(array('messages' => $messgs));
}
  

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

1. какая ошибка? пожалуйста, поделитесь, mysql_ * устарел и закрыт в php 7, если вы получаете белую страницу, что-то не так в вашем коде, возможно, у вас ошибка синтаксического анализа или фатальная для расширений. и я также надеюсь, что эта *$result опечатка не так ли?

2. Прежде всего, не используйте mysql. Он устарел. Используйте mysqli()

3. объясните свой вопрос и ожидания.

4. возможно, пустая страница только из $info = new Messages(); -за того, что внутри цикла while

5. in(SELECT *, max(id_message) as max_id FROM сообщения ` это не может так работать, вы можете просто использовать RANGE в IN ()

Ответ №1:

Я думаю, вы неправильно написали запрос в переменной $ sql или, возможно, у вас ошибка в коде PHP.

Используйте приведенный ниже запрос в phpmyadmin, я думаю, это решит ваши требования

 SELECT msg.* FROM  ( 
    SELECT * FROM message  ORDER BY created DESC)  as msg 
    (msg.`id_user_to`= 2 OR msg.`id_user_from`= 1 ) and msg.`status`= '0'  
    GROUP BY msg.`id_message_parent`";
  

Спасибо.

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

1. в нем говорится: у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘(msg.id_user_to= 1 ИЛИ msg.id_user_from = 1 ) и msg.status = ‘0’ GROUP BY msg.id_’ в строке 1

2. Я думаю, вы напутали со скобками

3. ага, нет ПРЕДЛОЖЕНИЯ WHERE