如何让MySQL查询自动忽略无赛事记录的周末日期
解决方案:自动展示有赛事的周末,忽略无赛事日期
核心思路
不再针对每个周末手动编写SQL查询,而是一次性获取所有赛事,按周末分组后只展示存在赛事的周末——赛事调整时无需修改代码,数据库有对应数据就自动显示,无数据则直接跳过。
步骤1:优化MySQL查询
使用以下SQL,获取所有赛事并标记其所属的周末(以当周周六为统一标识,将周六、周日的赛事归为同一周末分组):
SELECT rel_date, fixtures, -- 计算当前日期所属周末的周六(WEEKDAY返回值:0=周一,6=周日) DATE_ADD(rel_date, INTERVAL (6 - WEEKDAY(rel_date)) DAY) AS weekend_date FROM fixtures ORDER BY rel_date ASC;
步骤2:修改PHP代码实现自动分组展示
替换原有固定查询的PHP代码,实现按周末自动分组、仅输出有赛事的周末:
<?php $servername = "#"; $username = "#"; $password = "#"; $dbname = "#"; // 创建数据库连接 $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 执行优化后的查询 $sql = " SELECT rel_date, fixtures, DATE_ADD(rel_date, INTERVAL (6 - WEEKDAY(rel_date)) DAY) AS weekend_date FROM fixtures ORDER BY rel_date ASC; "; $result = $conn->query($sql); // 按周末分组存储赛事 $weekendFixtures = []; if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $weekendDate = $row['weekend_date']; // 将同周末的赛事归入同一分组 if (!isset($weekendFixtures[$weekendDate])) { $weekendFixtures[$weekendDate] = []; } $weekendFixtures[$weekendDate][] = $row['fixtures']; } } // 遍历分组,输出每个有赛事的周末 $weekendCount = 1; foreach ($weekendFixtures as $date => $fixtures) { // 输出周末标题,可自定义格式(比如显示周六日期+周末编号) echo "<h3>Weekend {$weekendCount} ({$date})</h3>"; $weekendCount++; // 输出该周末的所有赛事 foreach ($fixtures as $fixture) { echo "<div class='fixture-strip'>{$fixture}</div>"; } } // 无任何赛事时的提示(可选) if (empty($weekendFixtures)) { echo "<p>No fixtures scheduled</p>"; } $conn->close(); ?>
补充说明
- 自动适配赛事调整:新增或修改赛事日期后,代码会自动识别对应周末并展示,无需手动修改SQL或代码逻辑。
- 周末范围可自定义:如果你的周末定义是周五到周日,只需调整
DATE_ADD的计算逻辑,将周末标识改为周五即可。 - 性能优化:仅需一次数据库查询,相比原方案多次查询更高效。
内容的提问来源于stack exchange,提问作者terrencec63
相关产品推荐
相关产品推荐

