【问题标题】:If a select query return empty result, run another select query in mysql如果选择查询返回空结果,请在 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 表中获取。

标签: mysql


【解决方案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

    【讨论】:

    • IFNULLCOALESCE。参考this
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多