繁体   English   中英

将2个mysql查询优化为一个

[英]Optimize 2 mysql queries into one

使用php和mysql5.x。 我目前在网站的特定部分加载横幅图片,如下所示:

SELECT * FROM banners WHERE section = 1 AND pageid = 2

但是,如果未找到结果,则运行第二个查询:

SELECT * FROM banners WHERE section = 1 AND pageid = 0

基本上,我正在做的是尝试查找分配给该页面该部分的横幅图像。 如果未找到结果,则在第二个查询中寻找任何默认的横幅图像。 有没有更好的方法可以在一个查询中执行此操作?

编辑

要澄清一点。 我想检查是否有分配给该页面的横幅,如果没有,请查看是否有分配给0的横幅(默认)。 我既不希望混合显示分配给该页面的所有横幅,也不希望显示分配给pageid 0的所有横幅,并且有可能返回多个行而不仅仅是一个。

附加编辑

为了更好地解释这是为了什么。 在管理工具中,我允许某人将横幅图像分配给网站上的部分。 他们可以在管理工具中选择要显示标题图像的部分和页面。 他们还可以为该部分设置默认的横幅图像。 因此,如果默认情况下没有将横幅图像分配给某个部分,则它将在整个网站中加载为该部分分配为0的横幅图像。 因此,不必将默认的横幅图像分配给50个不同的页面,他们只需执行一次,它将为该部分加载默认的横幅图像。 只是试图找到一种以更优化的方式进行此操作的方法,而不是一次可以完成2个查询?

OR操作将使条件(pageid = 2 OR pageid = 0)返回true立即如果只是第一个值是true ,并因为有一个LIMIT 1 ,我认为它应该永远去取用pageid = 2首先,因为顺序pageidDESC并且2大于0。

SELECT * FROM banners WHERE section = 1 AND (pageid = 2 OR pageid = 0) ORDER BY pageid DESC LIMIT 1

编辑 :如果需要ORDER BY ,我不太肯定,我很乐意看到一些评论

也许这不是最优雅的方法,但是您可以尝试以下方法:

SELECT * 
FROM banners 
WHERE section = 1 
AND pageid = IF(
    (select count(*) from banners where section = 1 and pageid = 2) = 0, 
    0, 2
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM