有点不是很明白,但是楼主肯定可以只用一个SQL语句就可以完成要求了

解决方案 »

  1.   

    还是模拟个结果给大家看看..在文章这个表中有id,fid,title三列,其中id是文章编号,fid是文章列表页编号,看清了下面的fid吗?读出了三个fid,每个fid读出了3篇文章.这样怎么用一句查询呢Array
    (
        [0] => Array
            (
                [id] => 12
                [fid] => 5
                [title] => 第九
            )    [1] => Array
            (
                [id] => 11
                [fid] => 5
                [title] => 第八
            )    [2] => Array
            (
                [id] => 7
                [fid] => 5
                [title] => 第七个
            )    [3] => Array
            (
                [id] => 6
                [fid] => 4
                [title] => 第六个
            )    [4] => Array
            (
                [id] => 5
                [fid] => 4
                [title] => 第五个
            )    [5] => Array
            (
                [id] => 4
                [fid] => 4
                [title] => 第四个
            )    [6] => Array
            (
                [id] => 3
                [fid] => 3
                [title] => 第三个
            )    [7] => Array
            (
                [id] => 2
                [fid] => 3
                [title] => 第二个
            )    [8] => Array
            (
                [id] => 10
                [fid] => 3
                [title] => 第一个
            ))
      

  2.   

    SELECT id,title FROM table WHERE fid IN(1, 2, 3)...
    按照楼主所说的,用一个SQL语句(楼主的)应该可以读出楼主的结果,但是按照楼主提供的演示,还有一个fid没有放进数组,所以我想应该是这样:
    SELECT id,fid,title FROM table WHERE fid IN(1, 2, 3)...
      

  3.   

    sql类似如下, 你自己改成你的, 
    id等于你的id
    a1等于你的fid
    a2相当于你的title...
    这样,
    如果依时间排序取最近的,
    将 where a.id<=b.id 改为 where a.createtime<b.createtime 这样...
    有问题再问
    select a.id,a.a1,a.a2,b.id,b.a1,b.a2
    from t3 a
    join t3 b
    on a.a1=b.a1
    where a.id<=b.id
    group by a.id
    having count(*)<3
    order by a.a1,a.a2
    ;
    要测试我这句,可以用下面的sql建表及插入数据
    DROP TABLE IF EXISTS `t3`;CREATE TABLE `t3` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `a1` int(11) unsigned NOT NULL,
      `a2` varchar(50) NOT NULL,
      `a3` varchar(50) NOT NULL,
      `a4` datetime NOT NULL,
      `a5` text,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;/*Data for the table `t3` */insert into `t3` (`id`,`a1`,`a2`,`a3`,`a4`,`a5`) values (1,1,'aaa','bbb','0000-00-00 00:00:00',NULL),(2,1,'bbb','','0000-00-00 00:00:00',NULL),(3,1,'ccc','','0000-00-00 00:00:00',NULL),(4,2,'ddd','','0000-00-00 00:00:00',NULL),(5,2,'eee','','0000-00-00 00:00:00',NULL),(6,3,'fff','','0000-00-00 00:00:00',NULL),(7,1,'ggg','','0000-00-00 00:00:00',NULL),(8,2,'hhh','','0000-00-00 00:00:00',NULL),(9,3,'iii','','0000-00-00 00:00:00',NULL);
      

  4.   


    嘿嘿,因为你问能否写成一句sql,所以才写这个给你,一般不在程序里写这么绕的东西这个sql首先排序的字段 (也就是 where a.xx < b.xx )这里的字段上一定要有索引, 
    当然group by, order by, on 这几处的字段也要有。另因为用了 < 做连接,( 实际上是用 on a.a1=b.a1 和 a.id <= b.id 共同作的自联结,)
    结果集会比较大,因此在表内数据本身就大的情况下,尤其是同类别下数据比较多的情况,比较不好
    如果只是取3个结果,分开取一般来说更可取,而且分开取的sql更简洁易懂, 可读性好, 对我来说就算稍慢都愿意用这句大概只有同类别数据不多,需要取的类别多的情况下才有优势吧