You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL查询中排除当前年份?PHP+AJAX实现遇阻

解决筛选数据库年份并排除当前年份的问题

看起来你已经通过UNION整合了四个表的年份数据,但还没正确加上排除当前年份的过滤条件。我帮你调整查询语句,同时优化类型匹配避免潜在问题:

方法1:外层过滤已整合的年份(推荐写法)

把所有UNION的结果作为子查询,在外层统一排除当前年份,写法简洁且能利用UNION的去重特性:

<?php
session_start();
require_once 'connection.php';
$output = "";
// 修改后的查询语句
$query = "SELECT year FROM (
    SELECT DISTINCT DATE_FORMAT(`date_happened`,'%Y') AS year FROM `tbl_flood_info`
    UNION
    SELECT DISTINCT DATE_FORMAT(`date_happened`,'%Y') AS year FROM `tbl_fire_info`
    UNION
    SELECT DISTINCT DATE_FORMAT(`date_happened`,'%Y') AS year FROM `tbl_accident_info`
    UNION
    SELECT DISTINCT DATE_FORMAT(`date_happened`,'%Y') AS year FROM `tbl_crime_info`
) AS all_years
WHERE year != YEAR(CURDATE())
ORDER BY year DESC";

$result = mysqli_query($connection, $query);
$numrows = mysqli_num_rows($result);
$x = 0;
if ($numrows > 0) {
    while($row = mysqli_fetch_assoc($result)){
        $output .= "<option>" .$row['year']. "</option>";
        $x++;
    }
}
echo $output;
mysqli_close($connection);
?>

方法2:子查询内提前过滤(性能优化)

如果四个表的数据量较大,在每个子查询里就过滤掉当前年份的数据,可以减少UNION需要处理的数据量。这里用YEAR()函数直接提取年份(返回数字类型),和YEAR(CURDATE())类型一致,避免字符串与数字比较的潜在问题:

<?php
session_start();
require_once 'connection.php';
$output = "";
// 子查询内提前过滤的写法
$query = "(SELECT DISTINCT YEAR(`date_happened`) AS year FROM `tbl_flood_info` WHERE YEAR(`date_happened`) != YEAR(CURDATE()))
UNION
(SELECT DISTINCT YEAR(`date_happened`) AS year FROM `tbl_fire_info` WHERE YEAR(`date_happened`) != YEAR(CURDATE()))
UNION
(SELECT DISTINCT YEAR(`date_happened`) AS year FROM `tbl_accident_info` WHERE YEAR(`date_happened`) != YEAR(CURDATE()))
UNION
(SELECT DISTINCT YEAR(`date_happened`) AS year FROM `tbl_crime_info` WHERE YEAR(`date_happened`) != YEAR(CURDATE()))
ORDER BY year DESC";

$result = mysqli_query($connection, $query);
$numrows = mysqli_num_rows($result);
$x = 0;
if ($numrows > 0) {
    while($row = mysqli_fetch_assoc($result)){
        $output .= "<option>" .$row['year']. "</option>";
        $x++;
    }
}
echo $output;
mysqli_close($connection);
?>

AJAX小优化(可选)

如果页面可能多次调用这个接口,建议先清空下拉框再添加选项,避免重复内容:

$.ajax({
    type: "post",
    url: "../get_year.php",
    success: function(data) {
        $("#selectYear").empty(); // 先清空原有选项
        $("#selectYear").append(data.trim());
        getFilter();
    }
});

这样修改后,下拉框就只会显示2015-2019中排除当前年份的选项了。

内容的提问来源于stack exchange,提问作者Nyotnoti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:29:47