SQL实例系列 之一

有产品表,产品上架表,站点表,产品表和产品上架表的关系是1对n关系,站点表和产品上架表也是1对n的关系,产品表和站点表通过产品上架表实现了n对n的关系。通俗说就是,产品上架表中记录了每个产品、产品上架时间、是否在上架以及上架到了哪个站点。

现在要找出所有产品的最早上架时间以及是否已经上架(注,产品上架表中记录了同一个产品的多条记录,都有一个上架时间,以及这个产品是否在上架,只要有一个在上架就说明这个产品在上架的),那么从字面理解就是找出同一产品的所有记录,按照时间从小到大排序,取第一条记录的时间即为最早上架时间,然后对同一产品所有记录进行循环,判断是否有产品在上架,一旦碰到真就返回。

这个搞法面对数据表里面的上10万条数据时(超过1万产品),实在让人发毛。虽然从程序上来看,实现非常简单,也很好理解,但是它是最低效的。更加高效的做法应该是充分利用数据库的特征:

SELECT count(is_list) as is_list, create_time 
FROM product_site 
GROUP BY product_id ORDER BY create_time ASC

通过数据表索引的帮助,这条语句非常快速的返回了结果,虽然也有上万条记录,但是这个做法比最原始的做法至少提升10倍。10倍是什么概念,如果原始做法要10秒,那么后面的这个搞法只要1秒。

实际工作中遇到的问题,是为总结记录。