单个查询多个 selects - 即使一个 select returns 为空
Single query for several selects -even if one select returns empty
我需要创建多个 select 语句来获取简单数据(只有一行 包含 一个或多个字段每个 select).
简化示例:
select name, price from article where id=125
select log, email from user where uid=241
我只想处理来自 php 端 的一条语句(或者:我不想准备多条语句、执行多条语句、捕获和处理异常每次执行并最终获取每个语句的结果...)。
我试过了:
select * from (
(select name, price from article where id=125) as a,
(select log, email from user where uid=241) as b
)
如果每个子select returns 值:
,效果很好
name | price | log | email
------------------------------------------
dummy | 12,04 | john | john@example.com
但是如果其中一个子selectreturns为空,整个selectreturns为空.
我想要的是:空结果 subselects.
的空值
我用 ifnull()
和 coalesce()
尝试了很多事情,但无法得到等待的结果(我知道如何将它们与空值一起使用,但我没有找到处理它们的方法空结果集的情况)。
我终于找到了左连接的解决方案:
select * from (
(select 1) as thisWillNeverReturnEmpty
left join (select name, price from article where id=125) as a on 1
left join (select log, email from user where uid=241) as b on 1
)
即使其中一个子查询 returns 为空(甚至两个都为空,因此 "select 1")也能完美运行。
我在 SO 上发现的另一种方法是在每个子查询中添加一个 count(*)
以确保有一个值。
但这一切看起来都很脏,我不敢相信没有简单的方法只使用像 ifnull()
这样的东西。
正确的做法是什么?
我最终找到的最佳方法是:
select * from (
(select count(*) as nbArt, name, price from article where id=125) as a,
(select count(*) as nbUser, log, email from user where uid=241) as b
)
这样,子查询永远不会 returns 为空,这就解决了问题(始终至少有一个 "zero" 计数后跟空值)。
未找到文章时的示例结果:
nbArt | name | price | nbUser | log | email
----------------------------------------------------------------
0 | null | null | 1 | john | john@example.com
我需要创建多个 select 语句来获取简单数据(只有一行 包含 一个或多个字段每个 select).
简化示例:
select name, price from article where id=125
select log, email from user where uid=241
我只想处理来自 php 端 的一条语句(或者:我不想准备多条语句、执行多条语句、捕获和处理异常每次执行并最终获取每个语句的结果...)。
我试过了:
select * from (
(select name, price from article where id=125) as a,
(select log, email from user where uid=241) as b
)
如果每个子select returns 值:
,效果很好name | price | log | email
------------------------------------------
dummy | 12,04 | john | john@example.com
但是如果其中一个子selectreturns为空,整个selectreturns为空.
我想要的是:空结果 subselects.
的空值
我用 ifnull()
和 coalesce()
尝试了很多事情,但无法得到等待的结果(我知道如何将它们与空值一起使用,但我没有找到处理它们的方法空结果集的情况)。
我终于找到了左连接的解决方案:
select * from (
(select 1) as thisWillNeverReturnEmpty
left join (select name, price from article where id=125) as a on 1
left join (select log, email from user where uid=241) as b on 1
)
即使其中一个子查询 returns 为空(甚至两个都为空,因此 "select 1")也能完美运行。
我在 SO 上发现的另一种方法是在每个子查询中添加一个 count(*)
以确保有一个值。
但这一切看起来都很脏,我不敢相信没有简单的方法只使用像 ifnull()
这样的东西。
正确的做法是什么?
我最终找到的最佳方法是:
select * from (
(select count(*) as nbArt, name, price from article where id=125) as a,
(select count(*) as nbUser, log, email from user where uid=241) as b
)
这样,子查询永远不会 returns 为空,这就解决了问题(始终至少有一个 "zero" 计数后跟空值)。
未找到文章时的示例结果:
nbArt | name | price | nbUser | log | email
----------------------------------------------------------------
0 | null | null | 1 | john | john@example.com