お世話になります。表題の通りですが、EXISTS句でのソートが上手くいかずに困ってます。
会員同士でメッセージのやり取りが行われており、やり取りしている相手の一覧が添付の画像のように並んでいます。
(この一覧をクリックすることで、それぞれのメッセージにアクセスできる仕組み)
今回ご教示願いたいのは、この一覧の順序で、送信時間が新しいもの順に並べたいのですが、現状は会員のno(auto_increment値)が新しいもの順になっている状況です。
■会員のテーブルはこちら(余計なカラムは削除しています)
CREATE TABLE `member` ( `member_no` int(11) NOT NULL, `member_id` varchar(255) NOT NULL, `member_mail` varchar(255) NOT NULL, `member_img` varchar(255) NOT NULL COMMENT 'ファイル名' ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
■メッセージのテーブルはこちら。
CREATE TABLE `message` ( `message_no` int(11) NOT NULL, `message_to_member_no` int(11) NOT NULL, `message_from_member_no` int(11) NOT NULL, `message_exp` text NOT NULL, `message_file` varchar(255) NOT NULL COMMENT 'ファイルを,区切りで', `message_flag` enum('','hold') NOT NULL, `message_date` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /* message_from_member_noが送信者の会員No message_to_member_noが受信者となる会員No message_flag に"hold"という値がある場合は未読として処理 message_dateは送信時間 */
■そして肝心のリスト表示させているSQLは以下の通り。
/* 変数 $member_no は、自身の member_no。*/ $query = "SELECT member.member_no, member.member_id, member.member_img FROM member WHERE EXISTS(SELECT 0 FROM message WHERE (message_to_member_no = member.member_no AND message_from_member_no = $member_no) OR (message_from_member_no = member.member_no AND message_to_member_no = $member_no) ORDER BY message_date DESC LIMIT 1 ) ORDER BY member.member_no DESC"; $result = $mysqli->query($query); $page_cnt = $result->num_rows; if($page_cnt > 0){ while ($row = $result->fetch_assoc()) { if($row["member_img"] != ""){ $img_path = "/img_member/".$row["member_img"]; } else{ $img_path = "/images/no-image.jpg"; } $from_member_no = $row["member_no"]; $query2 = "SELECT message_to_member_no, message_from_member_no, message_flag FROM message WHERE message_to_member_no = '$member_no' AND message_from_member_no = '$from_member_no' AND message_flag = 'hold' ORDER BY message_no DESC"; $result2 = $mysqli->query($query2); $page_cnt2 = $result2->num_rows; if($page_cnt2 > 0){ $page_cnt2_view = "<span class=\"circle\">".$page_cnt2."</span>"; } else{ $page_cnt2_view = ""; } $side_area_member_list .= "<div class=\"MypageMessageList clearfix\"><div class=\"float-left\" style=\"width:40%;\"><img src=\"".$img_path."\" align=\"absmiddle\" class=\"image-round1\"></div><div style=\"float:left; width:60%;\"><a href=\"/Mypage/Message/?UserNo=".$row["member_no"]."\">".$row["member_id"]."</a> ".$page_cnt2_view."</div></div>"; } } /* 未読の値をバッジ表示すべく、お恥ずかしながら1つのSELECT文で処理できずに、回しながら都度SELECT文を置いてます。*/
お忙しいなか恐縮ですが、アドバイスのほど頂戴できれば幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー