簡體   English   中英

如何使用分組獲取(選擇)具有特定列最大值的行

[英]How to get(select) the rows with max value of a particular column using grouping

我有一張桌子,上面有學生們發行的書籍的重復數據。 學生可以發行書籍(在這種情況下一次發行一本書)。 表trn_books的SQL:

CREATE TABLE IF NOT EXISTS `trn_books` (
  `tb_id` int(11) NOT NULL,
  `tb_roll` varchar(50) NOT NULL,
  `tb_isbn` varchar(50) NOT NULL,
  `tb_date_issue` varchar(100) NOT NULL,
  `tb_date_return` varchar(100) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

INSERT INTO `trn_books` (`tb_id`, `tb_roll`, `tb_isbn`, `tb_date_issue`, `tb_date_return`) VALUES
(1, 'L23', '1234441225', '2017-01-10', '2017-01-20'),
(2, 'L54', '1225565412', '2017-01-12', '2017-01-22'),
(3, 'L23', '1225565412', '2017-01-22', '2017-01-31'),
(4, 'L24', '1225565412', '2017-02-01', '2017-02-11'),
(5, 'L23', '1225565412', '2017-02-15', '2017-02-25');

ALTER TABLE `trn_books`
  ADD PRIMARY KEY (`tb_id`);

記錄存儲方式如下: 查詢:SELECT * FROM trn_books

在此處輸入圖片說明

現在,我想根據學生的tb_roll分組來跟蹤他們的上一次活動。 正如我們所看到的,卷號為L23的學生在最后一次活動是(根據tb_date_return的最大值)的情況下發行了三本書。 (5,L23,1225565412,2017-02-15,2017-02-25)。 如果我按桌子分組,我會得到:

查詢:SELECT * FROM trn_books組,按tb_roll

在此處輸入圖片說明

但是我需要學生最近活動的結果(tb_date_return的最大值)。 期望結果應為tb_id's-> 5,4,2。

但是我正在獲取tb_id's-> 1,4,2如何通過mysql查詢實現它。

謝謝您的幫助...

您是否希望為任何給定的tb_roll返回最大日期?

select tb_roll, max(tb_date_return) as max_return
from trn_books
group by tb_roll

通常使用joingroup by來完成:

select b.*
from trn_books b join
     (select tb_roll, max(tb_date_return) as max_tb_date_return
      from trn_books
      group by tb_roll
     ) b2
     on b2.tb_roll = b.tb_roll and
        b2.max_tb_date_return = b.tb_date_return;

另一個常見的方法是相關子查詢:

select b.*
from trn_books b
where b.tb_date_return = (select max(b2.tb_date_return)
                          from trn_books b2
                          where b2.tb_roll = b.tb_roll
                         );

這是最大的團體明智的問題。 您需要使用交付的表格解決此問題。

詢問

    SELECT
     trn_books.*
    FROM (
      SELECT
         tb_roll
       , MAX(tb_date_return) as max_return 
      FROM 
       trn_books
      GROUP BY
       tb_roll
      ORDER BY 
       tb_roll ASC
    )
     AS 
      tb_roll_max
    INNER JOIN 
      trn_books
    ON
       tb_roll_max.tb_roll = trn_books.tb_roll
     AND
       tb_roll_max.max_return = trn_books.tb_date_return
     ORDER BY 
       trn_books.tb_id DESC 

結果

 tb_id  tb_roll  tb_isbn     tb_date_issue  tb_date_return  
------  -------  ----------  -------------  ----------------
     5  L23      1225565412  2017-02-15     2017-02-25      
     4  L24      1225565412  2017-02-01     2017-02-11      
     2  L54      1225565412  2017-01-12     2017-01-22    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM