代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

如何优化这些查询?

  •  0
  • Alix Axel  · 技术社区  · 15 年前

    请考虑以下代码段:

    $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查询的需求,并且只使用一个查询就可以完成相同的任务。

    我不认为不用子查询就能做到这一点,但我还是想听听你对此的看法。

    3 回复  |  直到 15 年前
        1
  •  1
  •   longneck    15 年前

    不,这是不可能的。mysql在limit子句中需要显式常量值。不能在限制子句中放入计算。

        2
  •  2
  •   stefita    15 年前
    $current = 'SELECT *, FOUND_ROWS(id) as num FROM ads WHERE featured = 1 ORDER BY id ASC LIMIT 1 OFFSET MOD(' . $beat . ', num)';
    
        3
  •  -1
  •   Serge Bogatyrev    15 年前

    无法优化查询。但是你可以优化算法。可能,你确实需要这样做,但是……)

    如果 $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