MYSQL获取字母数字排序的最后记录

时间:2015-12-15 02:52:14

标签: mysql

如何获取此表的最后一条记录:

id  trans_type  trans_date  reference_no
5804    RFBI    20151214    RFBI-20151214-1
5806    RFBI    20151214    RFBI-20151214-2
5809    RFBI    20151214    RFBI-20151214-3
5814    RFBI    20151214    RFBI-20151214-4
5818    RFBI    20151214    RFBI-20151214-5
5822    RFBI    20151214    RFBI-20151214-7
5823    RFBI    20151214    RFBI-20151214-8
5824    RFBI    20151214    RFBI-20151214-9
5825    RFBI    20151214    RFBI-20151214-10
5826    RFBI    20151214    RFBI-20151214-11
5827    RFBI    20151214    RFBI-20151214-12
5828    RFBI    20151214    RFBI-20151214-13
5821    RFBI    20151214    RFBI-20151214-14
5835    RFBI    20151214    RFBI-20151214-15

我可以使用此查询进行排序。

SELECT id,`trans_type`,`trans_date`,`reference_no`
FROM (`tbl_transaction` as trans)
WHERE (`trans_type` =  'RFBI'
AND `trans`.`trans_date` =  '20151214')
ORDER BY LENGTH(reference_no), `reference_no`

我需要获取最后一个reference_no

   5835 RFBI    20151214    RFBI-20151214-15

我在想这个查询

SELECT id,`trans_type`,`trans_date`,`reference_no`
FROM (`tbl_transaction` as trans)
WHERE (`trans_type` =  'RFBI'
AND `trans`.`trans_date` =  '20151214')
ORDER BY LENGTH(reference_no), `reference_no` DESC
LIMIT 1

但结果是:

5824    RFBI    20151214    RFBI-20151214-9

2 个答案:

答案 0 :(得分:3)

DESC中需要ORDER BY两次:

SELECT id, trans_type, trans_date, reference_no
FROM `tbl_transaction` trans
WHERE `trans_type` =  'RFBI' AND `trans`.`trans_date` =  '20151214'
ORDER BY LENGTH(reference_no) DESC, `reference_no` DESC
------------------------------^
LIMIT 1

答案 1 :(得分:1)

你可以这样做:

select id, trans_type, trans_date, reference_no
from tbl_transaction
where trans_type = 'RFBI'
and trans_date = '20151214'
order by id desc 
limit 1

另一种做同样事情的方法是删除除了最后的实际数字参考号以外的所有数字(但是性能可能需要注意......我只是提供额外的做法同样的事情)

select id, trans_type, trans_date, reference_no
from tbl_transaction
where trans_type = 'RFBI'
and trans_date = '20151214'
order by cast(replace(reference_no, concat(trans_type,'-',trans_date,'-'), '') as unsigned) desc
limit 1

在上面的这个方法中,我们利用了reference_no由trans_type和trans_date与破折号组合而成的事实。我们删除它们,只留下数字部分并将数字转换为无符号整数。我们按照最高优先级排序并取得第一条记录。

这导致了一个建议 - 你能不能只在reference_no列中存储一个整数?这样,您的排序将变得更加容易,您的存储要求将下降到整数(4个字节)。你的索引也会更小。在select数据时,您可以concat trans_type,trans_date和引用号。