如何用MySQL查询同表中某行日期在另一行起止日期范围内的数据
解决方案
没问题,咱们直接用MySQL来实现这个日期范围的筛选逻辑,不需要PHP额外处理数据。核心思路是通过自连接或者子查询先获取指定id对应的start和end日期,再筛选出date字段落在这个区间内的所有记录。
核心SQL逻辑
首先要注意:你的表中日期是dd/mm/yyyy的字符串格式,MySQL默认的日期比较规则是基于yyyy-mm-dd的,直接用字符串比较会得到错误结果,所以必须用STR_TO_DATE()函数把字符串转换成MySQL可识别的日期类型。
方式1:自连接(推荐,性能更优)
SELECT t.* FROM your_table t INNER JOIN your_table target ON STR_TO_DATE(t.date, '%d/%m/%Y') BETWEEN STR_TO_DATE(target.start, '%d/%m/%Y') AND STR_TO_DATE(target.end, '%d/%m/%Y') WHERE target.id = '你要指定的id'
方式2:子查询
SELECT t.* FROM your_table t JOIN ( SELECT STR_TO_DATE(start, '%d/%m/%Y') AS target_start, STR_TO_DATE(end, '%d/%m/%Y') AS target_end FROM your_table WHERE id = '你要指定的id' ) AS target_range ON STR_TO_DATE(t.date, '%d/%m/%Y') BETWEEN target_range.target_start AND target_range.target_end
修改后的PHP函数
另外,原来的函数直接拼接id存在SQL注入风险,建议用$wpdb->prepare()来绑定参数,更安全。修改后的函数如下:
function get($id){ global $wpdb; $table_name = $wpdb->prefix ."myTable"; // 使用自连接+参数绑定的SQL $sql = $wpdb->prepare(" SELECT t.* FROM {$table_name} t INNER JOIN {$table_name} target ON STR_TO_DATE(t.date, '%d/%m/%Y') BETWEEN STR_TO_DATE(target.start, '%d/%m/%Y') AND STR_TO_DATE(target.end, '%d/%m/%Y') WHERE target.id = %d ", $id); $results = $wpdb->get_results($sql); return $results; }
额外优化建议
如果你的start、end、date字段是MySQL的DATE类型(不是字符串),那可以去掉所有STR_TO_DATE()转换,直接比较,这样查询性能会更好:
SELECT t.* FROM {$table_name} t INNER JOIN {$table_name} target ON t.date BETWEEN target.start AND target.end WHERE target.id = %d
内容的提问来源于stack exchange,提问作者Mouner Mostafa
相关产品推荐
相关产品推荐

