2017-03-02 2 views
0

私は次のようになりますmysqlのテーブルをしましたuser_id | phone_number |メッセージ|方向| created_at同じテーブルの複数の結果を結合/結合するには? |</strong></p> <p>ID</p> <p><strong>user_messages:

ユーザー

ID |名前

user_messagesを2回グループ化して結果をUNIONにしたいとします。なぜ私はこれをしたいですか? user_idには有効なユーザーID(「-1」以外)があることがあるため、-1の場合はグループ化し、次にphone_numberの場合はグループ化します。 USER_IDが有効なユーザー

に設定されている場合には

私もユーザー名を取得するには、ユーザーテーブルと結合結果を残したい私はほとんどのクエリで終わりだが、問題がある:
- 私は、これは私を取得何

select * from (
(
    select *, count(*) as `total` from 
     (select `user_id`, `message`, `created_at`, `phone_number`,`direction` from `users_messages` where `user_id` != -1 order by `created_at` desc) 
    as `t1` group by `user_id` 
) 
union 
(
    select *, count(*) as `total` from 
     (select `user_id`, `message`, `created_at`, `phone_number`,`direction` from `users_messages` where `user_id` = -1 order by `created_at` desc) 
    as `t2` group by `phone_number` 
) 
) as `t3` 
left join (select `id`,`name` from `users`) as `t4` on `t3`.`user_id` = `t4`.`id` order by `created_at` desc 

が結果はcreated_atとのDESCでソートされていない最大のcreated_at値を意味し、最新のものであるとして、グループからの結果の記録を持つように結果が欲しい

更新: クエリは実際にローカルマシンでは動作しますが、実動サーバーでは動作しません。私のローカルマシンでは5.5.42 - Source distributionとサーバにはVer 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper ...何が間違っている可能性がありますか?ローカルマシンで

それは正しく私の最大のcreated_atを返しますが、サーバーでは、それはあなたがのuser_idとPHONE_NUMBERによってグループ化しているので、あなたがメッセージや方向性を維持することはできません、レコード

+0

は、あなたがサンプルを提供することができますデータおよびyからの所望の結果私たちのサンプルデータ?私はこのクエリが多く簡略化できるように感じる。データを見ると、問題を理解するのが良い方法です。 –

+0

'SELECT *、COUNT(*)FROM .... GROUP BY [行ID以外のフィールド]'はまれには良い考えです。 – Uueerdo

+0

@ JorgeCamposそれは実際には動作しますが、私にリモートサーバで異なる結果を与えます。私は私の質問を更新しました! – HorusCoding

答えて

1

何か作業をする必要があります:

SELECT s.`user_id`, um.`phone_number`, s.msgCount 
    , um.`message`, um.`created_at`, um.`direction` 
    , u.`name` AS userName 
FROM (
    SELECT `user_id`, IF(`user_id` = -1, `phone_number`, '') AS altID, MAX(`created_at`) AS lastCreatedAt, COUNT(*) AS msgCount 
    FROM `users_messages` 
    GROUP BY user_id, altID 
) AS s 
INNER JOIN `users_messages` AS um 
    ON s.user_id = um.user_id 
    AND s.altID = IF(um.`user_id` = -1, um.`phone_number`, '') 
    AND s.lastCreatedAt = um.created_at 
LEFT JOIN `users` AS u 
    ON s.user_id = u.user_id 
ORDER BY um.created_at DESC 
; 
  • s副問合せは、各ユーザーとuserless電話番号の要約情報を取得します。計算要約情報は、以下で使用するための最新のcreated_at値....
  • (参加基準にsからlastCreatedAt値を含むことによって)その最後のメッセージのための行データを取得umに参加
  • を含みますusersに参加し、最終的には、(そこには-1ユーザーでない、または、そのようなユーザーが適切な'unknown'名前を持っているということだろうと想定しています。)既知のユーザためuser.nameを取得するために使用され
+0

それはたくさんの意味がありますが、なぜ私が得ているのですか? 'on clause'のUnknown column 'u.user_id' – HorusCoding

+0

魅力的な作品!!!!!!!!! u.idにu.user_idを編集しました。 あなたは最高です! – HorusCoding

1

によってグループ化のために作成FIRSTを返します。各サブクエリにcreated_atのmax関数を追加します。私はこれがうまくいくと思います。このような

select * from (
(
    select user_id 
      ,'' as phone_number 
      ,max('created_at') as 'created_at' 
      ,count(*) as `total` from 
     (select `user_id` 
      ,`created_at` 
     from `users_messages` 
     where `user_id` != -1) 
    as `t1` group by `user_id` 
) 
union 
(
    select '' as user_id 
      ,phone_number 
      ,max('created at') as 'created_at' 
      ,count(*) as `total` from 
     (select `created_at` 
       ,`phone_number' 
     from `users_messages` 
     where `user_id` = -1) 
    as `t2` group by `phone_number` 
) 
) as `t3` 
left join (select `id`,`name` from `users`) as `t4` 
on `t3`.`user_id` = `t4`.`id` 
order by `created_at` desc 
+0

私のクエリは実際には動作しますが、私にはリモートサーバで異なる結果が出ます。私は質問を更新しました! – HorusCoding

関連する問題