【问题标题】:Mysql query retrieving posts and filtering based on specific date intervalsMysql查询检索帖子并根据特定日期间隔进行过滤
【发布时间】:2026-01-24 14:20:07
【问题描述】:

您好,我希望在存储一组日期间隔的页面中集成一个下拉选择/选项,这些日期间隔将通过相应的选定选项过滤 mysql 查询。不确定这是否是重复的,但在这里找不到类似的东西。

我从中检索“创建日期”的表有一个时间戳列。

这应该是一个 Mysql 查询,还是用 javascript 处理?最佳解决方案是什么?

例子:

<h3>Posts Filter</h3>
<select>
  <option>All Time</option>
  <option>Past Day</option>
  <option>Past Week</option>
  <option>Past Month</option>
  <option>Past Year</option>
</select>

<br>
<br>
<hr>

<div style="width:45%;height:200px;float:left;border:1px solid #ddd;padding:10px;margin:2.5%;box-sizing:border-box;">
  <h2>Post Header</h2>
  <em>Created On: February 21 2017</em>
  <p>Bacon ipsum dolor amet short ribs kevin ribeye meatball filet mignon swine pork loin spare ribs, pork belly cow tenderloin venison...</p>
</div>

<div style="width:45%;height:200px;float:left;border:1px solid #ddd;padding:10px;margin:2.5%;box-sizing:border-box;">
  <h2>Post Header</h2>
  <em>Created On: February 18 2017</em>
  <p>Bacon ipsum dolor amet short ribs kevin ribeye meatball filet mignon swine pork loin spare ribs, pork belly cow tenderloin venison...</p>
</div>

<div style="width:45%;height:200px;float:left;border:1px solid #ddd;padding:10px;margin:2.5%;box-sizing:border-box;">
  <h2>Post Header</h2>
  <em>Created On: January 26 2016</em>
  <p>Bacon ipsum dolor amet short ribs kevin ribeye meatball filet mignon swine pork loin spare ribs, pork belly cow tenderloin venison...</p>
</div>

<div style="width:45%;height:200px;float:left;border:1px solid #ddd;padding:10px;margin:2.5%;box-sizing:border-box;">
  <h2>Post Header</h2>
  <em>Created On: March 15 2016</em>
  <p>Bacon ipsum dolor amet short ribs kevin ribeye meatball filet mignon swine pork loin spare ribs, pork belly cow tenderloin venison...</p>
</div>

感谢您的任何意见!

谢尔盖

【问题讨论】:

    标签: javascript php mysql select filtering


    【解决方案1】:

    是的,由 ajax 处理...

    <select id="select">
      <option value="all">All Time</option>
      <option value="day">Past Day</option>
      <option value="weel">Past Week</option>
      <option value="month">Past Month</option>
      <option value="year">Past Year</option>
    </select>
    
    
    
    <script>
    $(document).ready(function(){
    
    $("#select").change(function() {
    
    
        $.ajax({
                    type: 'post',
                    url: "getSql",
                    data:  { $(this).val() },
                    success: function($response) {
                            response = $.parseJSON(reponse);
                            $.each(response, function(k, v) {
                                // key and value
                                $("YOUDIV").append(VALUE)
                            }); 
    
    
    
                    }
                }); 
    
    })
    
    
    })
    
    </script>
    

    【讨论】:

    • 谢谢拉斐尔。由于所有“帖子/内容”已经从数据库中提取并显示在页面上,是否需要对数据库进行另一个查询?我将如何利用帖子的时间戳将帖子过滤为仅在观众选择的日期间隔内显示的帖子?
    • 是的,每次更改或选择并填充 html 但没有页面重新加载时,ajax 都会进行查询
    【解决方案2】:

    答案是:这取决于用例。你必须意识到你正在做出的权衡:

    1. 在 JavaScript 中实现意味着您将一次性检索整个 MySQL 表,并在浏览器中执行过滤。

      • 查询执行速度会很快,因为数据库不需要评估任何条件

      • 您只需往返数据库一次

      • 需要通过网络发送的数据量可能会很大

      • 浏览器需要在内存中保存的数据量可能会很大,因此数据传输会更慢

      • 如果需要过滤大量数据,浏览器中的执行可能会很慢

    2. 在 MySQL 查询中实现它意味着您将只检索与您的条件匹配的那部分表,而不必在浏览器中执行过滤。

      • 查询执行速度会变慢,因为数据库必须评估条件

      • 您可能需要多次往返数据库

      • 需要通过网络发送的数据量会更少,因此数据传输会更快

      • 浏览器需要在内存中保存的数据量会更小

      • 在浏览器中执行会很快,因为不需要应用过滤逻辑

    从上面的列表中可以看出,桌子的大小起着至关重要的作用。如果表很小,我会选择 JavaScript 方法。如果表很大(或可能会变大),我会选择查询方法。

    【讨论】:

    • 罗比,也许我有点过分了。所有的记录都会显示在页面上,但是为了方便查看页面的人,我想实现过滤系统。因此,无论如何,我仍在访问数据库以检索所有记录,只需要一种方法让查看器过滤页面上呈现的内容。从我从你的帖子中读到的内容来看,没有必要再去一次(或几次)额外的去数据库了。
    • @Sergio 没错。在这种情况下,请使用 JavaScript 解决方案。
    • 谢谢罗比。如何利用 db 中的时间戳将实际时间戳(即:2017-02-18 03:21:10)转换为代表几天前(即:4 天前)的数字输出到 div?有没有可以在查询中进行这样的计算?
    • 认为我已经弄清楚了...通过运行此查询 - SELECT timestampdiff(DAY, now(), dateCreated) as days FROM posts