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)...
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);
嘿嘿,因为你问能否写成一句sql,所以才写这个给你,一般不在程序里写这么绕的东西这个sql首先排序的字段 (也就是 where a.xx < b.xx )这里的字段上一定要有索引, 当然group by, order by, on 这几处的字段也要有。另因为用了 < 做连接,( 实际上是用 on a.a1=b.a1 和 a.id <= b.id 共同作的自联结,) 结果集会比较大,因此在表内数据本身就大的情况下,尤其是同类别下数据比较多的情况,比较不好 如果只是取3个结果,分开取一般来说更可取,而且分开取的sql更简洁易懂, 可读性好, 对我来说就算稍慢都愿意用这句大概只有同类别数据不多,需要取的类别多的情况下才有优势吧
(
[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] => 第一个
))
按照楼主所说的,用一个SQL语句(楼主的)应该可以读出楼主的结果,但是按照楼主提供的演示,还有一个fid没有放进数组,所以我想应该是这样:
SELECT id,fid,title FROM table WHERE fid IN(1, 2, 3)...
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);
嘿嘿,因为你问能否写成一句sql,所以才写这个给你,一般不在程序里写这么绕的东西这个sql首先排序的字段 (也就是 where a.xx < b.xx )这里的字段上一定要有索引,
当然group by, order by, on 这几处的字段也要有。另因为用了 < 做连接,( 实际上是用 on a.a1=b.a1 和 a.id <= b.id 共同作的自联结,)
结果集会比较大,因此在表内数据本身就大的情况下,尤其是同类别下数据比较多的情况,比较不好
如果只是取3个结果,分开取一般来说更可取,而且分开取的sql更简洁易懂, 可读性好, 对我来说就算稍慢都愿意用这句大概只有同类别数据不多,需要取的类别多的情况下才有优势吧