一张表,如何按照from、to取得每个对应的最新一条记录?不好描述,详情请进,谢谢!

tianxueer 2012-03-02 10:15:52
数据示例:
id from to
------------------------------------------------------------------
10 1 2
20 2 1

30 1 3
40 3 1

50 4 1
60 1 4
------------------------------------------------------------------
比如现在我输入:10,

在from和to里面一共含有10的记录有三组,分别是:10和20,30和40,50和60
去最新的,所以最后应该返回:20,40,50

请大家针对需求,讨论一下,有没有高效快速的sql实现,谢谢!

...全文
117 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
WWWWA 和 ACMAIN_CHM 两位的都不错,非常感谢!

具体实现时,我想这么做:
增加一列flag,内容是:CONCACT(min(from, to), '_', max(from, to))
然后GROUP BY flag
这样就不需要UNION ALL 了,效率上会有提升。

我这么做只是针对具体应用,话说二位的sql还是非常棒的,谢谢!
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 acmain_chm 的回复:]

select max(id)
from (
select from,to,id
from 数据示例
union all
select to,from,id
from 数据示例
) t
where from=1
group by from,to
[/Quote]
Good!
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wwwwa 的回复:]

or
SELECT nf,nt,MAX(id) FROM (
SELECT a.id,IF(a.`from`>b.`from`,b.`from`,a.`from`) AS nf ,
IF(a.`to`<b.`to`,b.`to`,a.`to`) AS nt
FROM ttj a LEFT JOIN ttj b ON a.`from`=b.`to` AND a.`to`=b.`from`……
[/Quote]
Good!
WWWWA 2012-03-02
  • 打赏
  • 举报
回复
or
SELECT nf,nt,MAX(id) FROM (
SELECT a.id,IF(a.`from`>b.`from`,b.`from`,a.`from`) AS nf ,
IF(a.`to`<b.`to`,b.`to`,a.`to`) AS nt
FROM ttj a LEFT JOIN ttj b ON a.`from`=b.`to` AND a.`to`=b.`from`
WHERE b.`id`<a.`id`) a GROUP BY nf,nt
WWWWA 2012-03-02
  • 打赏
  • 举报
回复
数据要有代表性
SELECT DISTINCT MAX(id) FROM (
SELECT id,a.`from`,a.`to` FROM ttj a
UNION ALL
SELECT id,a.to,a.from FROM ttj a) a GROUP BY `from`,`to`
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwa 的回复:]

SELECT * FROM ttj a LEFT JOIN ttj b ON a.`from`=b.`to` AND a.`to`=b.`from`
WHERE b.`id`<a.`id`
[/Quote]
当我再插一条记录如下:
id from to
70 1 2
这时候就不行了
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jordan102 的回复:]

错了。是取大的哦。改成这样:

select max(id) from table_name where `from`=1 or `to`=1 group by `from`,`to`;
[/Quote]
不行
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwa 的回复:]

SELECT * FROM ttj a LEFT JOIN ttj b ON a.`from`=b.`to` AND a.`to`=b.`from`
WHERE b.`id`<a.`id`
[/Quote]

当我再插一条记录如下:
id from to
70 1 2
这时候就不行了
ACMAIN_CHM 2012-03-02
  • 打赏
  • 举报
回复
select max(id)
from (
select from,to,id
from 数据示例
union all
select to,from,id
from 数据示例
) t
where from=1
group by from,to
WWWWA 2012-03-02
  • 打赏
  • 举报
回复
SELECT * FROM ttj a LEFT JOIN ttj b ON a.`from`=b.`to` AND a.`to`=b.`from`
WHERE b.`id`<a.`id`
一起混吧 2012-03-02
  • 打赏
  • 举报
回复
错了。是取大的哦。改成这样:

select max(id) from table_name where `from`=1 or `to`=1 group by `from`,`to`;
一起混吧 2012-03-02
  • 打赏
  • 举报
回复
select min(id) from table_name where `from`=1 or `to`=1 group by `from`,`to`; 这个意思?
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wwwwa 的回复:]

即:id为10和20的两条记录可以分为一组:为什么,因为FROM 、TO 交叉?
[/Quote]

因为from和to是通信双方,id为10的记录是1发送给2的,id为20的记录是2发送给1的,发信人和收信人都是这两个人,所以分为一组
小小小小蜗牛 2012-03-02
  • 打赏
  • 举报
回复
这应该要写一个触发程序吧 当你在这两个列中插入1的时候 就触发还回结果
具体我也不会写 应该是这个套路吧
WWWWA 2012-03-02
  • 打赏
  • 举报
回复
即:id为10和20的两条记录可以分为一组:为什么,因为FROM 、TO 交叉?
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wwwwa 的回复:]

最新的标准是什么
FROM 、TO 交叉?
[/Quote]

只要from和to二者中有一个含有我传入的数字,就认为这条数据符合要求,
然后再按照from和to分组,分组时from和to没有顺序,即:id为10和20的两条记录可以分为一组
最后再取得每组中id最大的那一条记录
WWWWA 2012-03-02
  • 打赏
  • 举报
回复
最新的标准是什么
FROM 、TO 交叉?
tianxueer 2012-03-02
  • 打赏
  • 举报
回复
对不起,笔误,应该是:
-----------------------------------------------------------------------
比如现在我输入:1,

在from和to里面一共含有1的记录有三组,id分别是:10和20,30和40,50和60
取最新的,所以最后应该返回:20,40,60

请大家针对需求,讨论一下,有没有高效快速的sql实现,谢谢!
小小小小蜗牛 2012-03-02
  • 打赏
  • 举报
回复
意思问题我都看不懂 请说明白点
WWWWA 2012-03-02
  • 打赏
  • 举报
回复
最新的标准是什么
含有10的记录:怎么判断

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧