小演示数据贴,根据此提示,改了一下sql
http://bbs.csdn.net/topics/390399934
但是现在发现discuz防止子查询,虽然可以以使用外查询类来使用子查询sql,或是更改需求,
排除这些可能,如果硬要用无子查询话,
下面的测试数据都是基于disucz2.5的结构来的,有系统的同学可以自行测试一下.
先说需求,
选择出
按图片发布时间,大->小排序,(dx_home_pic表,picid是自增的,可用来代替时间倒序即可)
选择出符合条件的:hp.hot > 3 AND hp.thumb = '1' AND hp. STATUS = '0' AND ha.friend = '0'   (hp是dx_home_pic别名,dx_home_album别名是ha,hot是关注度,有缩略图[thumb字段],没关闭[status],非只允许朋友看ha.friend)
相同用户的只要最新那张,也就是排除相同用户
总要6张;不能使用子查询;
只要一句的sql
正常的含子查询的写法:select *
from (
SELECT 
hp.*
FROM
dx_home_pic AS hp
LEFT JOIN dx_home_album AS ha ON ha.albumid = hp.albumid
WHERE
hp.hot > 3
AND hp.thumb = '1'
AND hp. STATUS = '0'
AND ha.friend = '0'
ORDER BY
hp.picid DESC
)
 as tmp
GROUP BY uid
ORDER BY picid desc
LIMIT 6不包含子查询的sql,
SELECT hp.picid,hpb.picid ,   hp.dateline,hpb.dateline,   hp.hot,hpb.hot,   hp.username,hpb.username FROM dx_home_pic AS hp
LEFT JOIN dx_home_album AS ha ON ha.albumid = hp.albumid
LEFT JOIN dx_home_pic AS hpb ON hp.uid = hpb.uid and hpb.hot > 3 AND hpb.thumb = '1' AND hpb. STATUS = '0' AND hp.picid < hpb.picid 
WHERE hp.hot > 3 AND hp.thumb = '1' AND hp. STATUS = '0' AND ha.friend = '0' 
GROUP BY hp.picid HAVING count(hpb.uid) < 1
ORDER BY hp.picid DESC
LIMIT 6
但是在我看来,存在一个问题,如果某条记录符合
"LEFT JOIN dx_home_pic AS hpb ON hp.uid = hpb.uid and hpb.hot > 3 AND hpb.thumb = '1' AND hpb. STATUS = '0' AND hp.picid < hpb.picid "
它却是ha.freind = 1 ,也就是只允许朋友看,也会left join了,这时,count就不是0条了,而被排除,这结果就是错误的,
怎么改成一个效率比较高的无子查询的sql?