2016-09-26 5 views
0

私はcakephpでmysqlのcorequeryを使用しています。私は降順でレコードを欲しい。これはenter image description hereby group by節で作業しないで注文する

enter code here 
$coreQueryUser = $this->Message->query(
      "select * from messages where messages.list_id = 3 
      group By (if(sender_id > reciever_id, sender_id, reciever_id)), 
       (if(sender_id > reciever_id, reciever_id, sender_id)) 
      order by id desc 
      " 
     ); 

私のテーブル構造である私は、私はこのクエリを実行すると3

私は次の出力

を取得し、IDをリストに属し(SENDER_IDとreciver_idおよびその逆)に属している最後のメッセージをしたいです
<pre>Array 
(
[0] => Array 
    (
     [messages] => Array 
      (
       [id] => 1 
       [sender_id] => 21 
       [reciever_id] => 10 
       [list_id] => 3 
       [message] => hello 
       [add_date] => 2016-09-25 00:00:00 
       [is_check] => 0 
      ) 

    ) 

[1] => Array 
    (
     [messages] => Array 
      (
       [id] => 3 
       [sender_id] => 22 
       [reciever_id] => 10 
       [list_id] => 3 
       [message] => hello s 
       [add_date] => 2016-09-25 16:39:41 
       [is_check] => 0 
      ) 

    ) 

しかし、私はそのような結果wnat:

Array 
(
    [0] => Array 
     (
      [messages] => Array 
       (
        [id] => 2 
        [sender_id] => 10 
        [reciever_id] => 21 
        [list_id] => 3 
        [message] => hello sir 
        [add_date] => 2016-09-25 00:00:00 
        [is_check] => 0 
       )

) [1] => Array ( [messages] => Array ( [id] => 6 [sender_id] => 22 [reciever_id] => 10 [list_id] => 3 [message] => new [add_date] => 2016-09-25 16:39:41 [is_check] => 0 ) )

誰も私を助けることができる:(

+0

あなたは人間が読める形式であなたの期待と実際の結果をしてください投稿してくださいすることができます(行と列) – e4c5

答えて

1

問題は、あなたがGROUP BYリストでもない選択リストのいくつかのフィールドを持って、また対象となっているので、あなたのクエリはSQL標準に反しているということですsum()などの集計関数を使用します。残念なことに、このような無効なクエリは特定のSQLモード設定で実行されます(最新のバージョンのMySQLのデフォルト設定では、そのようなクエリが実行されなくなります)。

group by clause上のMySQLのドキュメントは(太字は私です)言うように:

ONLY_FULL_GROUP_BYが無効になっている場合は、GROUP BYの標準 SQLの使用に対するMySQLの拡張は、状態を有する、選択リストを許可、または ORDER列 が機能的にGROUP BY列に依存していない場合でも、非集約列を参照するためのBYリスト。これにより、MySQL は上記のクエリを受け入れます。 この場合、サーバは に自由であり、各グループから任意の値を選択するので、同じ値でなければ の値は不確定です、これはおそらくあなたが望むものではありません。 さらに、各グループからの値の選択は、ORDER BY句を追加することによって影響される にはなりません。結果セットの並べ替えは、値が選択された後に が発生し、ORDER BYは、サーバーが選択する各グループ内の値 に影響しません。

あなたは明らかに、グループごとにmax(id)と最新のレコードを(したい。適切な方法は、グループごとにmax(id)を返すサブクエリを持つことであり、外側のクエリで取得するにはIDを使用して戻ってあなたのメインテーブルに参加他のフィールドの値:。

select m.* 
from 
messages m 
inner join (
      select max(id) as maxid 
      from messages 
      where messages.list_id = 3 
      group By (if(sender_id > reciever_id, sender_id, reciever_id)), 
      (if(sender_id > reciever_id, reciever_id, sender_id)) 
      ) t1 on m.id=t1.maxid 
+0

はあなたの影をありがとう見つけるためにどのようにもう一つの問題があります魅力 のように動作します。同じクエリでリストID 3のメッセージを持っていて、cを持っているそのユーザーを望んでいないユーザーreatedリストid 3。私は1つのユーザーテーブルも持っています。ありがとうございます。 – kunal

+0

これは別の質問です。ただテーブルがどのように接続されているかを確認してください(それは解決策になります:)) – Shadow

+0

返信ありがとうございます:)基本的に私はwebservicesを通じて私たちのアプリでチャットモジュールをビルドしています。私はユーザーの1つのテーブルを持っていて、1つはリストのためのものであり、1つはメッセージテーブルです。この例では、リスティングを作成するユーザーはユーザーID 10です。私はそのようなリストID 3の最後のメッセージをフェッチし、それに対応するユーザーを見つけるようなクエリが欲しいが、私はそのリストを作成した結果でそのユーザーを望んでいない、つまり、私はユーザーIDを持っているユーザーが10を望んでいない – kunal