查询无法按预期工作

Hyd*_*erA 0 mysql sql

目标

从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
Run Code Online (Sandbox Code Playgroud)

问题

  • 选择有图片的blog_news ID,除非它们是徽标[正确]

  • 选择同时包含视频和图片的blog_news ID [正确]

  • 不选择只有视频[blog]的blog_news ids

Tom*_*Tom 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
Run Code Online (Sandbox Code Playgroud)

如果您只对子行的存在(或不存在)感兴趣,那么使用EXISTS通常更清晰,更容易.

  • @Vojta这远远高于你的语句,其中不必要的行的一大堆被查询来填充IN子句使用像在操作更有效率.使用EXISTS,优化器可以识别是否需要进行简单的EXISTence检查. (2认同)