2013-02-27 91 views
1

我有2个select语句。如果选择查询返回空结果,请在mysql中运行另一个select查询

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; 

如果第一个select语句返回一个空结果,那么我想运行第二个select语句。

请帮帮我。

+1

只需执行2个独立的查询,陆续 – zerkms 2013-02-27 04:55:56

+0

是否有任何可能的方式来做到这一点在MySQL? – 2013-02-27 05:01:17

+2

是否有任何理由在mysql中这样做? – zerkms 2013-02-27 05:05:09

回答

4

这似乎是从我刚才做的一个快速测试中起作用的,并避免了需要检查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); 
+0

聪明,非常聪明 – TehShrike 2013-02-27 06:38:51

+0

在同一个UNION查询中,SELECT中的FOUND_ROWS()的行为是否已更改?我看到这种方法适用于MySQL 5.1.61,但不适用于5.6.15。在后一种情况下,第二个SELECT中的FOUND_ROWS()似乎返回前一个查询而不是前一个SELECT。我错过了什么吗? – eirikir 2014-05-07 20:23:50

+0

他们之间的联盟和发现的行之间很难,但它取决于需求和表架构 – Vineet1982 2014-05-08 03:05:15

1

如果您需要选择crm_products.price如果srm_stock_manager.unit_price为NULL,则可以使用COALESCE,你不需要2个查询。您可以根据需要更改SELECT声明的第一部分,如下所示,以获取所需结果。

SELECT sm.id, COALESCE(sm.unit_price, p.price) unit_price FROM... 

这将返回p.price值,如果sm.unit_price为NULL。

此外,请参阅mysql doc

+0

'IFNULL'或'COALESCE'。请参阅[this](http://stackoverflow.com/questions/4747877/mysql-ifnull-vs-coalesce-which-is-faster)。 – chandimak 2013-02-27 06:18:44

1

你可以像下面这样做

$query1 = mysql_query("YOUR QUERY"); 
$row_count = mysql_num_rows($query1); 
if($row_count==0) { 
$query1 = mysql_query("Your Second Query"); 
} 

切记不要使用mysql_*功能,因为它们是贬值了。

希望这有助于