【发布时间】:2014-07-31 13:20:12
【问题描述】:
这是我正在使用的当前查询,到目前为止它做得很好:
SELECT a.*
FROM ads AS a
WHERE id = (
SELECT id
FROM ads AS b
WHERE a.zone_name=b.zone_name
AND publish_date <= CURDATE() AND expire_date >= CURDATE() AND active = 1
LIMIT 1
)
它为每个现有区域返回一个广告,然后在按区域对它们进行排序后,在模板中的适当位置显示适当的广告。
现在我们引入了响应式布局,因此这些区域不能始终适合广告的相同尺寸,我希望始终获取适合的最大尺寸。我首先使用 Javascript 读取浏览器分辨率,将其传递回 PHP,然后 PHP 和 MySQL 可以决定适合哪些广告。
但我不知道如何比我在下面提供的解决方案更容易地将该条件放入查询中,我想要一个更好的解决方案。由于不同的区域将在相同的分辨率下适应不同的尺寸,我需要一种方法来指定每个区域的大小,我能想到的唯一方法是逐个获取它们,为每个区域指定所需的大小,然后在他们身上做一个UNION ALL。
但这似乎执行起来相当缓慢,我想知道是否有更好的方法可以简化条件并可能删除publish_date 条件的重复,避免UNION,因此(希望)执行得更快?
(SELECT ads.* FROM ads WHERE zone_name = 'b' AND width=468 AND publish_date <= CURDATE() AND expire_date >= CURDATE() AND active = 1 LIMIT 1)
UNION ALL
(SELECT ads.* FROM ads WHERE zone_name = 'a1' AND width=728 AND publish_date <= CURDATE() AND expire_date >= CURDATE() AND active = 1 LIMIT 1)
...
【问题讨论】: