2017-02-27 10 views
0

私のテーブル構造Iは、日付(最長最初)に基づく各sub_typeの行をフェッチしたいMySQLのソートは異なる

id parent last_date  sub_type 
---------------------------------- 
11 9  2017-02-28 1101 
10 9  2016-08-26 1101 
8 1  2017-02-20 1101 
12 12  2016-08-31 1102  
14 12  2016-12-20 1102  
9 9  2016-12-31 1101 
13 12  2017-03-23 1102 
2 1  2017-01-25 1101 
1 1  2016-12-31 1101 

を次のように。私は、クエリ

SELECT * FROM mytable GROUP BY sub_type ORDER BY ISNULL(last_date) DESC, last_date DESC 

以下しようと、それは

id parent last_date sub_type  
-------------------------------- 
1 1  2016-12-31 1101  
12 12  2016-08-31 1102  

を結果しかし、私は結果の下に期待しています。

id parent last_date sub_type  
-------------------------------- 
13 12  2017-03-23 1102 
11 9  2017-02-28 1101  

上記の結果を得るために私を誘導してください。

EDIT:

LAST_DATEはNULL値に日付のエントリの上にいるだろう最高の優先順位を有することができます。 Thatswhy私はISNULL DESC注文を選択します。

+1

'SELECT sub_type、MAX(last_date)FROM mytable GROUP BY sub_type'? –

+0

'id'は主キーですか? –

+1

複数のnullレコードが存在する場合はどうなりますか?どのレコードをフェッチしますか? @Forward。 – Blank

答えて

1

は、あなたが探している行のIDを見つけるために、ORDER BYとLIMIT 1とWHERE句で相関サブクエリを使用することができます。

SELECT * 
FROM mytable t1 
WHERE id = (
    SELECT id 
    FROM mytable t2 
    WHERE t2.sub_type = t1.sub_type 
    ORDER BY ISNULL(last_date) DESC, last_date DESC, id DESC 
    LIMIT 1 
) 

デモ:http://rextester.com/DSPH11524

注:sub_typeをインデックス化する必要があります。

+0

お返事ありがとうございました。私はあなたの提案を試みます – ArK

1

これは、集計によって各グループの1レコードをフェッチする典型的な質問です。試してみてください:

select 
    mytable.* 
from mytable 
join (
    select max(last_date) as last_date, sub_type from mytable group by sub_type 
) t1 on mytable.sub_type = t1.sub_type and mytable.last_date = t1.last_date 

この記事を参照してくださいHow to select the first/least/max row per group in SQL

関連リンク右の

Retrieving the last record in each group

およびdemoはsqlfiddleです。

編集:sqlfiddleで

select 
    mytable.* 
from mytable 
join (
    select 
     max(last_date) as last_date, 
     max(isnull(last_date)) nulled, 
     sub_type 
    from mytable 
    group by sub_type 
) t1 on mytable.sub_type = t1.sub_type 
and (t1.nulled and mytable.last_date is null or (t1.nulled <> 1 and mytable.last_date = t1.last_date)) 

demo:なし2と同じ最後の日付とヌルの優先順位が存在しない場合、その後、これを

してみてください。

+0

お返事ありがとうございます。私はあなたの提案を試みます。 – ArK

1

sub_typeの列に基づいて行番号を指定し、last_date列の降順で行番号を指定することもできます。

クエリ

select t1.`id`, t1.`parent`, t1.`last_date`, t1.`sub_type` from 
(
    select `id`, `parent`, `last_date`, `sub_type`, 
    (
     case `sub_type` when @A 
     then @R := @R + 1 
     else @R := 1 and @A := `sub_type` end 
    ) as `rn` 
    from `your_table_name` t, 
    (select @R := 0, @A := '') r 
    order by `sub_type`, `last_date` desc 
)t1 
where t1.`rn` = 1; 

Sql Fiddle demo

+0

あなたの答えをありがとう。私はあなたの提案を試してみます – ArK

0

あなたは間違ったクエリを書かれています。

クエリ以下句

があなたの期待どおりの結果が得られます場所後のWHERE条件を指定してください。

SELECT id,parent,max(last_Date),sub_type FROM mytable GROUP BY sub_type 
+0

@ Ajay Singhはノートに感謝します。型エラーです。 – ArK

+0

'id'列と' parent'列は集約関数ではなく、group by節にもありません。 – Wanderer

+0

mysqlの@ullasグループのすべての列を指定する必要はありません。式でグループをグループ化します。 –

関連する問題