日期:2014-05-19  浏览次数:20432 次

left join 后的表多条记录.取1.
alist主表.记录每样物品的详细信息.
bopen次表.记录用户每次打开物品的记录.
每次A用户或B用户打开BOPEN后,BOPEN就会生产一条记录.
SQL生成了一个
case   when   not   XXXX   is   null   then   '1 '   else   '0 '   end   ynopen  
如果有记录ynopen的值就为1,如果没有记录ynopen就为0

现用
select   alist.id   as   aid,
case   when   not   b.autoid   is   null   then   '1 '   else   '0 '   end   YNopen
from   alist   left   join   bopen   on   alist.id=b.id
where   条件语句
如此一来,会出现大量结果
于是就用了distinct进行精简重复的

select   alist.id   as   aid,
case   when   not   b.id   is   null   then   '1 '   else   '0 '   end   YNopen
from   alist   left   join   bopen   on   alist.id=b.id   and   username= 'a '
where   条件语句

(主alist有2万多条记录.bopen打开记录也有1万条(以后会增加到上百万))
用distinct精简后,可以实现ynopen的效果,但速度非常慢,平均会用7秒的时间.
其实对比的时候,我只需要判断bopen是否有用户的记录即可,如何写?
如果有记录,ynopen就为1,没有就为0,以标示用户是否打开过.

------解决方案--------------------
或者

select alist.id as aid,
case when not b.autoid is null then '1 ' else '0 ' end YNopen
from alist left join (Select id, Max(autoid) As autoid From bopen Group By id) b on alist.id=b.id