Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何优化这些查询?_Php_Sql_Mysql_Math - Fatal编程技术网

Php 如何优化这些查询?

Php 如何优化这些查询?,php,sql,mysql,math,Php,Sql,Mysql,Math,考虑以下代码段: $beat = date('B'); // 1 beat = 86.4 seconds, 1000 beats = 1 day $total = 'SELECT COUNT(id) FROM ads WHERE featured = 1;'; // number of featured ads $current = 'SELECT * FROM ads WHERE featured = 1 ORDER BY id ASC LIMIT 1 OFFSET ' . ($beat %

考虑以下代码段:

$beat = date('B'); // 1 beat = 86.4 seconds, 1000 beats = 1 day
$total = 'SELECT COUNT(id) FROM ads WHERE featured = 1;'; // number of featured ads
$current = 'SELECT * FROM ads  WHERE featured = 1 ORDER BY id ASC LIMIT 1 OFFSET ' . ($beat % $total) . ';'; // current featured ad
基本上,这一循环贯穿于所有特色广告中,为每个广告提供一个节拍(86.4秒)窗口,在该窗口中,他们将获得特别的亮点,例如:

$beat       $total          $current

0           3           0
1           3           1
2           3           2
3           3           0
4           3           1
5           3           2
6           3           0
7           3           1
这工作得很好,但是我想知道是否有可能消除对$total查询的需要,并且只使用一个查询就可以完成相同的任务


我不认为不使用子查询就可以这样做,但我还是想听听您对此的意见。

不,这是不可能的。mysql在LIMIT子句中需要一个显式常量值。您不能将计算放在LIMIT子句中。

您不能优化查询。但你们可以优化算法。也许,您确实需要这样做,但是……)

$current = 'SELECT *, FOUND_ROWS(id) as num FROM ads WHERE featured = 1 ORDER BY id ASC LIMIT 1 OFFSET MOD(' . $beat . ', num)';
如果
$total>=1000
您将永远不会显示某些广告。在任何情况下,某些广告显示的次数比其他广告多

long timestamp = ... // standard timestamp in millis
long period = 86400; // millis
long total = ... // you total query
long offset = (timestamp / period) % total;
current = ... // you last query, but with my offset

最后一个查询不应该只选择featured=1的查询吗?给定数据集,您可以用3替换$total。也许你想给出一个更丰富的例子?@lanut:是的,很抱歉,现在已经解决了。@Robert:这只是一个例子,$total当然可以是任何给定的数字。LIMIT 1子句不会影响计数函数吗?是的,谢谢你的提示。应该使用find_ROWS()而不是在LIMIT子句中使用显式常量值。您不能在限制条款中进行计算。您能建议其他解决方法吗?仅仅为此做两个查询似乎太麻烦了。这算是一个优化吗?我仍然需要做2次查询,算法基本相同,我省略了$total的1000限制,因为这很琐碎,很难解决,只会给问题增加噪音。我的第一句话:“你不能优化查询”。因此,这不是优化。