对datetime字段用DATE()取日期时如何用DISTINCT去重
下拉框日期选项去重实现方法
你可以从两个层面解决重复日期的问题,优先选择SQL层面处理,性能更高。
方案1:SQL查询阶段直接去重(推荐)
直接在查询时使用MySQL内置的DATE()函数提取datetime字段的日期部分,搭配DISTINCT关键字直接返回去重后的日期值,还可以加排序规则让下拉选项更规整,不需要查询多余的重复字段,性能最优。
修改后的完整代码如下:
<select name="closeddate" class="box" value="No filter applied" id="closeddate"> <option>No filter applied</option> <?php // 直接查询去重后的日期,不需要查所有字段 $sql1= "SELECT DISTINCT DATE(close_date) as c_date FROM tbl_jobs where STATUS = 'closed' ORDER BY c_date DESC"; $result = mysql_query($sql1); while($data = mysql_fetch_array($result)){ $datedata = date('d-m-Y', strtotime($data['c_date'])); echo "<option>$datedata</option>"; } ?> </select>
说明:
DATE(close_date)会自动把YYYY-MM-DD HH:MM:SS格式的datetime值截取为YYYY-MM-DD的纯日期格式,DISTINCT会自动过滤相同日期的重复记录,ORDER BY c_date DESC可以让日期按最新到最旧排序,也可以改成ASC按正序排列。
方案2:PHP代码层去重(适合无法修改SQL语句的场景)
如果不能调整现有查询逻辑,可以先把所有解析出来的日期存入临时数组,通过PHP自带的array_unique()函数过滤重复值后,再遍历输出下拉选项。
修改后的代码片段如下:
<select name="closeddate" class="box" value="No filter applied" id="closeddate"> <option>No filter applied</option> <?php $sql1= "SELECT * FROM tbl_jobs where STATUS = 'closed'"; $result = mysql_query($sql1); $date_arr = array(); // 先把所有日期存入数组 while($data = mysql_fetch_array($result)){ $datedata = date('d-m-Y', strtotime($data['close_date'])); array_push($date_arr, $datedata); } // 对数组去重 $date_arr = array_unique($date_arr); // 遍历去重后的数组输出选项 foreach($date_arr as $d){ echo "<option>$d</option>"; } ?> </select>
注意:你当前使用的mysql_*系列数据库函数已经在PHP5.5版本后被废弃,存在严重安全隐患,建议后续替换为mysqli或者PDO扩展操作数据库。
内容的提问来源于stack exchange,提问作者Codeman_cas
相关产品推荐
相关产品推荐

