日期:2014-05-16  浏览次数:20869 次

mysql 求一条高效SQl
MYsql

A表(主表)
ID clm1 clm2 date
1 A A 2012-01-01
2 B B 2012-01-01
3 C C 2012-01-02
4 D D 2012-01-03

B
ID A_ID day com1 com2
1 1 20120101 c1 c2
2 1 20120102 d1 d2
3 1 20120105 e1 e2
4 2 20120108 f1 f2
5 2 20120107 g1 g2
6 3 20120101 h1 h2
7 3 20120102 i1 i2

A表 ID是主键 date是索引
B表 ID是主键
A的ID和B表的A_ID是关联键


我想得到的结果
A.ID A.clm1 A.clm2 B.ID B.day B.com1 B.com2
1 A A 3 20120105 e1 e2
2 B B 4 20120108 f1 f2
3 C C 7 20120102 i1 i2
4 D D NULL NULL NUll NULL
就是取A表和B表中day最大的数据和A表联起来。

请高手写一个效率最高的SQL。因为我的数据库用两个表有百万的数据。谢谢。。。

------解决方案--------------------
select * from a left join 
(select * from b b1 where not exists(select 1 from b where b1.A_ID=A_ID and b1.day<day)) b2
on a.id=b2.A_ID
------解决方案--------------------
SQL code
SELECT A.ID,A.clm1, A.clm2,B.ID,max(B.day),B.com1,B.com2
from A表,B表
where A.ID=B.A_ID
group by A.ID,A.clm1,A.clm2,B.ID,B.com1,B.com2
或
 SELECT A.ID,A.clm1, A.clm2,B.ID,B.day,B.com1,B.com2
from A表 A,
(select B.ID,MAX(B.day),B.com1,B.com2 from B表 group by B.ID,B.com1,B.com2)B
WHERE A.ID=B.A_ID

------解决方案--------------------
SQL code
select A.ID,A.clm1,A.clm2,B.ID,B.day,B.com1,B.com2
from A left join (select * from B t where not exists (select 1 from B where A_ID=t.A_ID and ID>t.ID)) x on A.id=x.A_ID