两个表,一对多关系,用right join 能够拿出很多记录,
现在想问一下各位,能不能用一条语句拿出对应的前几条记录,
例如:
A -------A1
A -------A2
A -------A3
A -------A4
B -------B1
B -------B2
B -------B3
B -------B4我要的结果是分别拿出前几条,如:
A -------A1
A -------A2
B -------B1
B -------B2

解决方案 »

  1.   

    示例:
    select * from (
    select *,(select count(*) from tt where a.id<=id) as px from tt a) 
    where px<=2
      

  2.   

    or
    select * from company a
    where (select count(*) from company where dep=a.dep and a.id<=id)<=2
      

  3.   

    不是这个意思,是对两个表A,B,连接之后的结果进行过滤,就是我只要分别显示最近的前几条记录。
    例如: 
    A -------A1 
    A -------A2 
    A -------A3 
    A -------A4 
    B -------B1 
    B -------B2 
    B -------B3 
    B -------B4 
    C -------C1 
    C -------C2
    ...我要的结果是分别拿出前几条,如: 
    A -------A1 
    A -------A2 
    B -------B1 
    B -------B2 
    C -------C1 
    C -------C2
    ...
      

  4.   

    关键是A1、A2中的内容是什么?贴出来看看,字符型 OR 数字型?
      

  5.   

    可能写A1,2什么的不清楚,这么说的,很简单的一个一对多的关系:A父表 主键 A_id(int) ,B 子表,含字段 A_id(int),通过这个字段实现两表关联。
    通过 A right join B 之后得到很多记录,而现在只要保留各自对应关系的前N条即可。
    谢谢。
      

  6.   

    A表:
    Pid Name
    1 Peter
    2 Sam
    3 JoeB表:
    Cid Pid Course
    1 1 English
    2 1 Chinese
    3 1 Math
    4 2 Chinese
    5 2 English
    6 3 English
    7 3 Chinese
    8 3 Math
    9 3 Art期待结果:
    A.Pid A.Name Cid Pid Course
    1 Peter 1 1 English
    1 Peter 2 1 Chinese
    2 Sam 4 2 Chinese
    2 Sam 5 2 English
    3 Joe 6 3 English
    3 Joe 7 3 Chinese
      

  7.   

    select * from aaa a right join bbb b on a.pid=b.pid
    where (select count(*) from bbb where cid<=b.cid and b.pid=pid)<=2
      

  8.   

    你测试过上述SQL语句没有?是正确的
      

  9.   

    不正確,用这个比较是不对的cid <=b.cid,它们之间没有可比性,还有count(*)也是不对的。
      

  10.   

    为什么没有可比性?,除非你的表中CID不是唯一的,我用你上述数据测试,结果正确
    已经说过,除非有唯一标识的字段才行,B表中的CID是唯一的。
      

  11.   

    我测试过了,上述数据是可以的,但是现实数据比较复杂,可能我给的条件不够,而写在上千条数据时,该语句执行时间太长(已加了索引)约30秒,而且偶尔会触发mysql的异常,不过还是感谢你指引了方向,之前我抄你的SQL抄错了一点,不好意思。
      

  12.   

    用你自己给出的上述数据测试,效率高一些,在PID、CID上建立索引:
    select A.Pid,A.Name,b.Cid,b.Pid,b.Course 
     from aaa a right join bbb b on a.pid=b.pid
    right join bbb c on c.cid <=b.cid and c.pid=b.pid
    group by A.Pid,A.Name,b.Cid,b.Pid,b.Course 
    having count(b.cid)<=2