如果选择查询返回空结果,请在 mysql 中运行另一个选择查询
Posted
技术标签:
【中文标题】如果选择查询返回空结果,请在 mysql 中运行另一个选择查询【英文标题】:If a select query return empty result, run another select query in mysql 【发布时间】:2013-02-27 04:46:01 【问题描述】:我有 2 个选择语句。
1- select sm.id, IFNULL(sm.unit_price,0) as unit_price
from crm_stock_manager sm
left join crm_purchase_order_items poi on poi.id = sm.purchase_order_item_id and poi.is_del = 0
left join crm_products p on poi.product_id = p.id and p.is_del = 0
where sm.is_del = 0 and IFNULL(sm.unit_price, '') != '' and p.id = 253 order by sm.created_on;
2- select 0 as id ,price as unit_price from crm_products where id = 253 and is_del=0;
如果第一个选择语句返回一个空结果,那么我想运行第二个选择语句。
请帮帮我。
【问题讨论】:
只需执行 2 个单独的查询,一个接一个 有没有办法在 mysql 上做到这一点? 有什么理由在 mysql 中这样做吗? 这是否意味着如果 srm_stock_manager.unit_price 为 NULL,您需要选择 crm_products.price? 没有。如果 crm_stock_manager 表包含我需要从该表中获取记录的任何数据。否则它将从 crm_products 表中获取。 【参考方案1】:这似乎在我刚刚进行的快速测试中有效,并且避免了两次检查 x=1 是否存在的需要。
SELECT SQL_CALC_FOUND_ROWS *
FROM mytable
WHERE x = 1
UNION ALL
SELECT *
FROM mytable
WHERE
FOUND_ROWS() = 0 AND x = 2;
另一种方法是使用 EXISTS 或 NOT EXISTS 的子查询
SELECT column1 FROM t1 WHERE NOT EXISTS (SELECT * FROM t2);
【讨论】:
在同一个 UNION 查询中跨 SELECT 的 FOUND_ROWS() 行为是否发生了变化?我看到这种方法适用于 MySQL 5.1.61,但不适用于 5.6.15。在后一种情况下,第二个 SELECT 中的 FOUND_ROWS() 似乎返回前一个查询而不是前一个 SELECT。我错过了什么吗? 联合行和找到的行之间存在很大的困难,但这取决于需要和表架构 不存在是一个不错的解决方案【参考方案2】:你可以这样做
$query1 = mysql_query("YOUR QUERY");
$row_count = mysql_num_rows($query1);
if($row_count==0)
$query1 = mysql_query("Your Second Query");
切记不要使用mysql_*
函数,因为它们已被贬值。
希望对你有帮助
【讨论】:
【参考方案3】:如果你需要选择crm_products.price
,如果srm_stock_manager.unit_price
为NULL,你可以使用COALESCE
,你不需要2个查询。您可以按如下方式更改SELECT
语句的第一部分,并根据需要更改其他部分以获得所需的结果。
SELECT sm.id, COALESCE(sm.unit_price, p.price) unit_price FROM...
如果 sm.unit_price
为 NULL,则返回 p.price
值。
进一步,参考mysqldoc。
【讨论】:
IFNULL
或 COALESCE
。参考this。以上是关于如果选择查询返回空结果,请在 mysql 中运行另一个选择查询的主要内容,如果未能解决你的问题,请参考以下文章
踩坑记录Mysql查询使用group_concat函数后,如果查询无结果,仍会返回一条空数据
踩坑记录Mysql查询使用group_concat函数后,如果查询无结果,仍会返回一条空数据