使用MYSQL,从子查询SELECT中每隔第n行选择一次

时间:2018-04-20 17:46:49

标签: php mysql database

我有一个超过300,000行的表格,我想在图表上呈现这些数据,但是300,000行并不是一次真正必要的。例如,即使某一天可能有100行数据,如果我显示一整年的数据,我也不需要显示所有数据。所以我想" granularize"数据。

我正在考虑获取所有内容,然后使用脚本删除我不需要的内容,但这似乎对数据库来说会更慢更难。

所以这就是我到目前为止所拥有的。

var SubFormStuff = {

  init: function()
    this.applySubConditionalRequired();
    this.bindUISubActions();
  },

  bindUISubActions: function() {
    // when a radio or checkbox changes value, click or otherwise
    $("input[type='radio'].stepThreeDiag").change(function() {
      if($(this).attr("id") == "maybe_evtDiag") {
        $(this).prop('checked', false);
      }else{

       //this is not working //
        applySubConditionalRequired(this);
        displaySubFormRequired(this);

      }
    });
  },

  applySubConditionalRequired: function() {
    $(".require-if-subevent-active").each(function() {
      var el = $(this);
      // does something
    });
  },

  displaySubFormRequired: function() {
    $(".div-subevent-class").each(function() {
      var el = $(this);
      // does something else
    });
  }

};

SubFormStuff.init();

这给了我所有行和数字。我计划添加一个where子句来获取每1000行(即每第n行),就像这样

SET @row_number := 0;
  SELECT @row_number := @row_number + 1 as row_number, 
  price, region, timestamp as row_number FROM pricehistory;

但是由于某种原因,MYSQL没有将SET @row_number := 0; SELECT @row_number := @row_number + 1 as row_number, price, region, timestamp as row_number FROM pricehistory WHERE row_number % 1000 = 0; 视为列。有任何想法吗?我已经在线查看了其他解决方案,但它们似乎并不适合MYSQL。

2 个答案:

答案 0 :(得分:0)

正如Racil的评论建议的那样,如果你有一个自动递增的id字段,你可以去;但是您已经说过不同日期的数据量可能会有所不同,因此可能会产生非常扭曲的图表。如果您选择一年中的每1000条记录,并且一半的行是过去3个月("假日购物"对于商业示例),则一年的后半部分图形实际上将反映后一季度的年。为了获得更有用的结果,您可能会更喜欢这样的事情:

SELECT region, DATE(timestamp) AS theDate
    , AVG(price), MIN(price), MAX(price)
FROM pricehistory
GROUP BY region, theDate
;

答案 1 :(得分:0)

看起来我不会得到另一个答案所以我会继续写下我想出的解决方案。

我的数据分布均匀,因为它定期抓住价格,因此没有理由担心这一点。

这是我的解决方案。

假设我有500,000行,我想显示这些行的子集,比如5000行。 500000/5000是100所以我拿100并在我的选择语句中使用它,如SELECT * FROM pricehistory where id % 100 = 0;

这是实际代码

public function getScaleFactor($startDate, $endDate) { $numPricePoints = $this->getNumPricePointsBetweenDates($startDate, $endDate); $scaleFactor = 1; if ($numPricePoints > $this->desiredNumPricePoints) { $scaleFactor = floor($numPricePoints / $this->desiredNumPricePoints); } return $scaleFactor; }

然后我在SQL中使用$scaleFactor,如SELECT * FROM pricehistory WHERE id % {$scaleFactor} = 0;

这不是一个完美的解决方案,因为你并不总是准确地得到5000行,但我并不需要5000行。我只是试图降低数据的分辨率,同时仍然得到一个看起来接近我使用所有500,000行的图表。

相关问题