4

MySQL の各グループの最初の行を選択するにはどうすればよいですか (日時順)?

私は試してみましたが、これにたどり着きました:

SELECT *
FROM `cats`
WHERE `war_id` = 0 
AND `eyes_color` = 'green' 
AND `id` IN
    (SELECT `id` FROM
        (SELECT * FROM `cats` ORDER BY `date_last_fought` DESC) AS t
    GROUP BY `war_id`, `n_of_medals`)

ちょっとうまくいきますが、これまでで最高かどうかはわかりません。

これを単純化できると思いますか?

4

2 に答える 2

5

私はこれに単純化しようとします...

SELECT * FROM `cats`
inner join (select * from cats 
        WHERE `warid` = 1 AND `color` = 'green' 
        order by orderDate desc) a 
        on (cats.id=a.id)
group by cats.warId;


ここで見ることができますhttp://sqlfiddle.com/#!2/55f5b/5
しかし、それがあなたのクエリよりも優れているかどうかはわかりません.... EXPLAINから読んで行動することは、まだ私の宿題になります:D

ID  SELECT_TYPE TABLE      TYPE    POSSIBLE_KEYS    KEY   KEY_LEN   REF    ROWS EXTRA
1   PRIMARY     <derived2> ALL     (null)          (null) (null)    (null)   2  Using temporary; Using filesort
1   PRIMARY     cats       eq_ref  PRIMARY         PRIMARY  4       a.id     1  
2   DERIVED     cats       ALL     (null)          (null) (null)    (null)   6  Using filesort

インデックスを追加すると高速になります

于 2013-02-16T21:32:40.857 に答える
0

これが私の解決策です:

SELECT * FROM `cats` c
JOIN (
    SELECT `war_id`, `n_of_medals`, MAX(`date_last_fought`) date_last_fought
    FROM `cats` 
    WHERE `war_id` = 0 
    AND `eyes_color` = 'green' 
    GROUP BY `war_id`, `n_of_medals` 
) c_summary ON c_summary.war_id = c.war_id
AND c_summary.n_of_medals = c.n_of_medals 
AND c_summary.date_last_fought = c.date_last_fought
ORDER BY c.`date_last_fought` DESC;

http://sqlfiddle.com/#!2/05bcb/2

于 2013-05-17T01:23:30.757 に答える