目标
从blog_news中选择不同的ID
active = 1
标题不为空
至少有一张图片,或者至少有一个视频
到目前为止的陈述
select distinct n.id from blog_news n
left join blog_pics p ON n.id = p.blogid and active = '1' and trim(n.title) != ''
left join blog_vdos v ON n.id = v.blogid
where (p.islogo = '0' and p.id is not null) OR (v.id is not null)
order by `newsdate` desc, `createdate` desc
问题
选择有图片的blog_news ID,除非它们是徽标[正确]
选择同时包含视频和图片的blog_news ID [正确]
不会选择仅包含视频的博客新闻ID [错误]
答案 0 :(得分:5)
这个怎么样:
SELECT DISTINCT n.id
FROM blog_news n
WHERE n.active = '1'
AND trim(n.title) != ''
AND (EXISTS (SELECT 1
FROM blog_pics p
WHERE p.blogid = n.id
AND p.islogo = 0)
OR EXISTS (SELECT 1
FROM blog_vdos v
WHERE v.blogid = n.id)
)
ORDER BY n.newsdate desc, n.createdate desc
如果您只对子行的存在(或不存在)感兴趣,那么使用EXISTS通常更清晰,更容易。
答案 1 :(得分:0)
我在查询中看不到任何问题。
我希望active
是blog_news
表中的列,您应该将其称为n.active
。如果此列位于blog_pics
表中,那么这就是问题所在。
我会将条件(n.active,n.title)添加到WHERE,因为它与左连接(blog_pics)无关 - 但这只是为了更好的可读性,结果将是相同的。
您也可以使用子选择来编写查询:
SELECT n.id FROM blog_news n
WHERE n.active = 1 AND TRIM(n.title) != '' AND n.id IN (
SELECT DISTINCT p.blogid FROM blog_pics p WHERE p.islogo = 0 UNION
SELECT DISTINCT v.blogid FROM blog_vdos
);