查询无法按预期工作

时间:2010-12-19 10:51:26

标签: sql mysql

目标

从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 [错误]

2 个答案:

答案 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)

我在查询中看不到任何问题。

我希望activeblog_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
);