2017-05-08 6 views
1

を使用してテーブルの一意/別個の行を選択してください。実際には、質問として一意になる適切なタイトルはわかりません。私を信じて、inner joinuniondistinctについて検索するために最善の努力をしました。特定の条件を持つが、GROUP BY

私は、1つのテーブルのみを持っており、それは次のようになります。

ID | ITEM | MESSAGE_INFO | PARENT_ID | IS_CLOSED | IS_APPROVAL 
1 | A123 | test 1  | null | 1  |  1 
2 | A123 | reply to.. | 1  | null | null 
3 | A123 |another reply.| 1  | null | null 
4 | B456 | test 2  | null | null |  1 
5 | A123 | new test 1 | 1  | null |  1 
6 | C789 | test 3  | null | 2  |  1 
7 | C789 | reply to 3 | 6  | null | null 

:原作者から

  • メッセージは1列とPARENT_ID IS_APPROVALになりますnullことですこれが送信された元のメッセージであることを意味します。 IS_CLOSEDは、会話がまだ開いている場合は1、元の投稿者が返信できなくなった場合は2となります。nullこれは受信者がまだメッセージを開いていないことを意味します。
  • PARENT_IDには、メッセージが返信しているIDが含まれます。原作者へ
  • メッセージの返信はIS_CLOSED

nullを持つことになります今、私が何をしたいのか、私には、各項目の原作者から最新のメッセージを取得したいです。私はこのクエリを試してみました

ID | ITEM | MESSAGE_INFO | PARENT_ID | IS_CLOSED | IS_APPROVAL 
5 | A123 | new test 1 | 1  | null |  1 
4 | B456 | test 2  | null | null |  1 

:だから、期待される結果は、このようなものです

SELECT * 
FROM TABLE 
WHERE IS_APPROVAL = 1 
    AND (
     IS_CLOSED IS NULL 
     OR IS_CLOSED < 2 
     ) 
GROUP BY ITEM 
ORDER BY ID DESC; 

しかし、私は取得していた結果がこれです:

ID | ITEM | MESSAGE_INFO | PARENT_ID | IS_CLOSED | IS_APPROVAL 
1 | A123 | test 1  | null | 1  |  1 
4 | B456 | test 2  | null | null |  1 
+0

'SELECT *'は 'GROUP BY'と組み合わせることはできません。無効なSQLです。 MySQLはバージョン5.7.5よりも前のバージョンを受け付けていますが、[列挙されている](https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html)、 'GROUP BY'節には現れません。 – axiac

+3

[MySQL](https://dev.mysql.com/doc/refman/5.7/en/)および[SQL Server](https://docs.microsoft.com/en-us/sql/t-sql/)言語参照)は、異なる企業によって作成された無関係の異なるソフトウェアパッケージです。正しいタグを使用してください。 – axiac

+0

ヘッドアップありがとう。私はsql-serverは文字どおりサーバーを意味し、SQLクエリであると考えていました。私は質問を入力していた間にそれは自動的に追加されたので、私はそれを削除することを考えなかった。 – threeFatCat

答えて

2

これはトリックを行う必要があります。

SELECT tab.* FROM tab 
INNER JOIN (SELECT MAX(ID) as ID FROM tab WHERE IS_APPROVAL = 1 AND (IS_CLOSED IS NULL OR IS_CLOSED<2) GROUP BY ITEM) ids 
ON tab.ID = ids.ID; 

まず、h各項目グループのIDが最も高いID(最近の尺度として)、それから自分自身で結合を実行します。

0

実際のテーブル構造ですか?

declare @t table(ID int,ITEM varchar(50),MESSAGE_INFO varchar(50) 
, PARENT_ID int, IS_CLOSED int,IS_APPROVAL int) 
insert into @t VALUES 
(1 ,'A123',' test 1  ',null ,1  , 1 ) 
,(2 ,'A123',' reply to.. ', 1 ,null ,null) 
,(3 ,'A123','another reply.', 1 ,null ,null) 
,(4 ,'B456',' test 2  ', null ,null , 1 ) 
,(5 ,'A123',' new test 1 ', 1 ,null , 1 ) 
,(6 ,'C789',' test 3  ',null , 2 , 1 ) 
,(7 ,'C789',' reply to 3 ', 6 ,null ,null) 

;With CTE as 
(
select *,ROW_NUMBER()over(partition by item order by id desc)rn 
from @t 
where IS_APPROVAL = 1 AND (IS_CLOSED IS NULL OR IS_CLOSED<2) 
) 
select * from cte where rn=1 
+0

はい、そうです。私はテーブル構造を作成しませんでした。私はシステム全体の一部を強化しようとしています。 – threeFatCat

関連する問題