将2个mysql查询优化为一个

时间:2011-06-19 15:13:32

标签: mysql query-optimization

使用php和mysql 5.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 个答案:

答案 0 :(得分:3)

如果第一个值为OR(pageid = 2 OR pageid = 0)运算符将立即返回true条件true,因为有一个LIMIT 1我认为它应始终首先使用pageid = 2获取一个,因为pageid的顺序为DESC且2大于0。

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

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

答案 1 :(得分:0)

也许这不是最优雅的方式,但你可以试试这个:

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