【问题标题】:Optimize 2 mysql queries into one将2个mysql查询优化为1个
【发布时间】:2011-09-18 04:39:54
【问题描述】:

使用 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 个查询可以一次完成吗?

【问题讨论】:

    标签: mysql query-optimization


    【解决方案1】:

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

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

    【讨论】:

    • @Karolis 好吧,我不知道优化,但是当我解释它时,它看起来不错,没有临时表或全表扫描。所以我会用这个。谢谢!
    • @John subselect 没有任何动态值,所以 MySQL 在执行 main select 之前计算 subselect 的值。因此,速度应该与运行您问题中提到的 2 个单独的查询几乎相同。
    • @Karolis 好的部分是我可以查询一个单独的表来获取计数,而第二个表是 myisam,所以获取计数应该非常快。
    • 当 select 语句中没有 where 子句时,@John Count on MyISAM 很快。但我认为它仍然足够快。
    • @Karolis 哦,我认为 myisam 即使使用 where 子句也能更快地获得 count(*) 与 innodb。
    【解决方案2】:

    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 是必要的,我不肯定,我很想看到一些 cmets

    【讨论】:

    • 这不行,因为你不能保证返回 2 行中的哪一行。您应该添加order by 或其他内容。
    • GROUP BY 怎么样?
    • @Connor 在这种情况下,哪个值是第一个反对OR 并不重要。结果顺序仍然出乎意料。你需要order by pageid desc
    • 哎呀,我的意思是order 不是group 我在自己的代码中也一直在意外地这样做>。
    • @Connor Smith 正如我在此处的另一个答案中所述,如果我返回多行,则此查询不起作用。它不仅返回当前页面 id 的横幅图像,还返回 pageid 为零的横幅 id。它不能同时是分配给页面的所有横幅图像或分配为零的所有横幅图像。我不能两者兼而有之。
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多