gpt4 book ai didi

php - Mysql:如果不满足搜索条件,查询可以返回最后一条记录吗?

转载 作者:行者123 更新时间:2023-11-29 11:56:59 25 4
gpt4 key购买 nike

我有一个脚本,可以根据请求的日期搜索某些值。

SELECT `entry_value` FROM `data` WHERE (`entry_year` =  $year AND `entry_month` = $month) LIMIT 1;

现在的问题是,当用户输入太近的日期并且找不到该日期的值时,我想获取最新的可用条目。

我知道如何检索最后一个条目,我可以使用第一次调用来首先检查最后一个可用日期是什么,然后调用上面的查询或其他查询来获取最后一个值(如果请求的日期不可用) 。只是想知道,有没有办法直接向 mysql 询问?我无法编写代码,因为我不知道要使用哪种构造,但理想情况下的逻辑如下:

SELECT `entry_value` FROM `data` 
WHERE (`entry_year` = $year AND `entry_month` = $month)
OR_IF_NOT_FOUND WHERE MAX(`id`)
LIMIT 1;

mysql中有类似的东西吗?

亲切的问候

最佳答案

方法1

您可以运行查询,然后使用 UNION 以相同顺序运行具有相同字段的“默认”查询。

SELECT ...query1...
UNION
SELECT * FROM ( SELECT ... LIMIT 1 ) AS defaults;

这将始终运行第一个查询第二个查询,并且始终比单独第一个查询返回的结果多一个。然后由您决定是否放弃最后的结果。

另一种可能性是以相反的顺序进行。现在首先返回“空”结果:

SELECT * FROM ( SELECT ... LIMIT 1 ) AS defaults;
UNION
SELECT ...query1...

这样您就可以提取一个元组,然后继续,就像您单独运行第一个查询一样。

方法2

在某些情况下,您可以根据结果建立偏好顺序。例如:

SELECT `entry_value` FROM `data` WHERE (`entry_year` = $year AND
`entry_month` = $month) LIMIT 1;

可能会变成:

SELECT `entry_value` FROM `data` ORDER BY 
(`entry_year` = $year AND `entry_month` = $month) DESC,
`entry_year` = $year DESC,
ABS(`entry_year` - $year)*12 + ABS(`entry_month` - $month)
LIMIT 1;

这将检索所有数据,并且 (entry_year = $year AND entry_month = $month) 可以为 true (1) 或 false (0)。 DESC 顺序将使第一行成为完美匹配的行。

同样,在不匹配的行中,如果存在年份正确的行,则将被随机选择。但如果所需年份根本不存在数据,则将选择时间距离最小的行。

此方法强烈建议在使用的字段(年和月)上建立索引,并将扫描所有记录。所以它可能相当昂贵。

方法3

就性能而言,方法 1 与运行两个查询几乎相同,因此如果可能的话,您宁愿显式地执行此操作,例如:

// CODE BEFORE MODIFICATION (ran 1 query)
$query = "SELECT...";
// Execute query

foreach ($tuple = SQLFetch($handle)) {
// ...do something with data
}



// CODE AFTER (2 queries - or any number, actually)

$queries = [
"SELECT ...",
"SELECT ... LIMIT 1",
];
foreach ($queries as $query) {
// $query =
// Execute $query
foreach ($tuple = SQLFetch($handle)) {
// ...do something with data
}
if (SQLNumRows($handle) > 0) {
break;
}
}

正如您所看到的,旧代码实际上保持不变,并且仅当之前的查询没有返回任何内容时才会执行额外的查询(或多个查询)。获取元组和检索元组计数的实际指令取决于您使用的实际数据库接口(interface)。

关于php - Mysql:如果不满足搜索条件,查询可以返回最后一条记录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33044184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com