Fib*_*con 18 mysql select default
我有以下select语句,以获取流的下一个计划项.如果没有匹配的行,我希望它返回默认值.这是我正在使用的线:
SELECT `file` FROM `show`, `schedule`
WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP()
AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file`
ORDER BY `start_time` DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
这应该抓住最近计划的项目,但不是如果它超过查询前30分钟.但是,如果用户没有安排任何内容,我想要一个默认值,以便在流上实际播放某些内容.我尝试过以下方法:
SELECT COALESCE(`file`, 'default.webm') FROM `show`, `schedule`...
Run Code Online (Sandbox Code Playgroud)
和:
SELECT IFNULL(`file`, 'default.webm') FROM `show`, `schedule`
Run Code Online (Sandbox Code Playgroud)
但是,如果找不到行,它总是返回空结果.如何返回默认值?
pet*_*erm 22
一种方法
SELECT IFNULL(MIN(`file`), 'default.webm') `file`
FROM `show`, `schedule`
WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP()
AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file`
ORDER BY `start_time` DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
由于您只返回一行,因此您可以使用聚合函数,在这种情况下MIN(),确保NULL如果没有选择记录,您将获得.然后IFNULL()或COALESCE()将完成它的工作.
对于只需要一行结果的情况,只需UNION在第二SELECT个子句中使用硬编码值,该子句与原始SELECT具有相同的列数.
对于OP:
(SELECT `file` FROM `show`, `schedule`
WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP()
AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file`
ORDER BY `start_time` DESC LIMIT 1) UNION (SELECT 'default.webm') LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
除非出现语法错误,否则结果集将提供一行,并调用一列file.
作为一个更一般的例子:
(SELECT Col1,Col2,Col3 FROM ExampleTable WHERE ID='1234')
UNION (SELECT 'Def Val','none','') LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
在任一情况下:
如果在第一个SELECT中找不到行,则结果集将使用第二个SELECT中的值填充.
如果在第一个SELECT中找到一行,则在结果集中提供第一个SELECT值,并省略第二个SELECT值.
*如果要从第一个SELECT使用相同的列(按相同顺序),则不必为第二个SELECT值分配列名/别名.
*UNION不要求两个联合查询中的列名相同,实际上,如果它有助于您的情况,您可以为第二个SELECT查询分配不同的列名.(您的结果集处理代码需要适应这些列命名差异.)
(SELECT Col1,Col2,Col3 FROM ExampleTable WHERE ID='1234')
UNION (SELECT 'Def Val' AS `Fallback1`,'none' AS `Fallback2`,'' AS `Fallback3`) LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
我的意见是,这很容易阅读,看起来不像是一个征税的问题.