質問: 「ユーザID」) AND to_user_flg != 0 GROUP BY ROOMID ORDER BY SORT ASC, max_id DESC ``` よろしくお願い致します。
回答: やりたい事は、恐らく、 送受信したチャットを1:1のチャット相手ごとに、 未読順、最後の送受信順にソートしたいように見受けました。 が、色々とおかしいので、いくつか指摘だけ。 (1) > > > > | to_user_flg | from_user_flg | > | --- | --- | > | 送信者フラグ | 受信者フラグ | > > > 受信者フラグは下記のようになっています。 > > to_user_flg > > > ⇒言いたい事は分かりますが、見直し(修正)してくださいね。 (2) > > 「from_user_id|」 > > > ⇒最後の「|」は何でしょう?(他の項目も) (3) > > CONCAT(to_user_id|, from_user_id|) > > > ⇒WHERE句にidを指定しているので、バグではないですが、 to_user_idとfrom_user_idの間に何かしらの数値以外 (「|」がその役割?)を含めないと、 「12と34のチャット」と「1と234のチャット」が同一になります。 (4) > > from_user_flg = 「ユーザID」 > > > ⇒from_user_idの間違えでは? (5) > > (CASE WHEN (to_user_id = 「ユーザID」 AND to_user_flg=1) > > THEN 0 #未読 > > WHEN (to_user_id = 「ユーザID」) > > THEN 1 #既読 > > ELSE 2 #返信済み > > > ⇒このCASE文でやりたい事はそもそも何でしょう? 「未読が1件でもあれば0?最後が未読なら0? 受信が1件でもあれば1?最後が受信で止まってたら1? 最後が送信者なら2?」 最初に記載した「未読順、最後の送受信順」であれば、 1と2は区別の必要はない気もしつつ。 記載されたSQLから読み取ると、 a:「昔の受信で、相手の送信で終わってるもの」 b:「最近送信し、返信待ちのもの」 があった際、aを先に表示するってことですかね? (6) > > jushinn_op_flg != 0 > > > ⇒この項目は? to_user_flg と from_user_flg が0以外? (7) > > おそらくGROUP BYで持ってきてるSORTが最後のやり取りから取得できてない > > > ⇒記載されたSQLのGROUP BY にはSORTが含まれてませんので、 現在のSORTの中身は、適当に返された値です。 また、日本語で「最後のやり取りから」に該当する部分の SQLの記載がありません。 MAX(id)に対して、mail_data テーブルのidと紐づけが必要です。 > > 意思通り取得できる方法はありませんでしょうか。 > > > ⇒CASE文やEXISTS句、副問合せ等を利用すれば、方法はいくらでもあります。 (「1件でもあれば~」なら、EXISTS句、 「最後の送受信が~」なら、副問合せが必要です) (8) > > 最悪、テーブルは追加できます。 > > > ⇒全体が不明なので、判断はできませんが、 「1:1のチャット毎」ではなく、「ルーム(部屋)毎」という表現に こだわりがあるのであれば、 ルームテーブルが必要な気はします。