2013-02-27 88 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_*功能,因爲它們是貶值了。

希望這有助於