2012-08-14 122 views
1

將兩個MySQL語句合併爲一個MySQL時遇到了困難,此時我必須先運行它們,然後將它們放入數組中,然後合併這些數組。如何將兩個類似的MySQL語句合併爲一個

這裏的功能

1功能

/* returns all books from table book */ 
function getProfitableBooksNew(){ 
    $q = "SELECT *, 

    ROUND((amazon_new_price/100*80) - lowest_new_price,2) AS margin 

    FROM ".TBL_BOOKS." 

    WHERE rank < 200000 AND rank IS NOT NULL 
    AND lowest_new_price < amazon_new_price/100*80 
    AND amazon_new_price < 9999 
    AND ROUND((amazon_new_price/100*80) - lowest_new_price) > (lowest_new_price/100*".MARGIN.") 

    ORDER BY rank ASC"; 

    $result = mysql_query($q, $this->connection); 

    if(!$result || (mysql_numrows($result) < 1)) 
     return null; 

    $arr = array(); 
    $numRows = mysql_num_rows($result);//count 
    if($numRows>0){ 
     for($i=0; $i<$numRows; $i++){ 
      $arr[] = array(
       "isbn"     => mysql_result($result, $i, "isbn"), 
       "title"     => mysql_result($result, $i, "title"), 
       "rank"     => mysql_result($result, $i, "rank"),     
       "amazon_price"   => mysql_result($result, $i, "amazon_new_price"), 
       "amazon_condition"  => "New", 

       "lowest_price"   => mysql_result($result, $i, "lowest_new_price"), 
       "lowest_condition"  => "New", 

       "margin"    => mysql_result($result, $i, "margin"), 

       "last_price_updated" => mysql_result($result, $i, "last_price_updated"), 
       "last_rank_updated"  => mysql_result($result, $i, "last_rank_updated") 
      ); 
     } 
    }  

    return $arr; 
} 

第2個功能

/* returns all books from table book */ 
function getProfitableBooksUsed(){ 
    $q = "SELECT *, 

    ROUND((amazon_used_price/100*80) - lowest_used_price, 2) AS margin 

    FROM ".TBL_BOOKS." 

    WHERE rank < 200000 AND rank IS NOT NULL 
    AND lowest_used_price < amazon_used_price/100*80 
    AND amazon_used_price < 9999 
    AND amazon_used_price < amazon_new_price 
    AND ROUND((amazon_used_price/100*80) - lowest_used_price) > (lowest_used_price/100*".MARGIN.") 

    ORDER BY rank ASC"; 

    $result = mysql_query($q, $this->connection); 

    if(!$result || (mysql_numrows($result) < 1)) 
     return null; 

    $arr = array(); 
    $numRows = mysql_num_rows($result);//count 
    if($numRows>0){ 
     for($i=0; $i<$numRows; $i++){ 
      $arr[] = array(
       "isbn"     => mysql_result($result, $i, "isbn"), 
       "title"     => mysql_result($result, $i, "title"), 
       "rank"     => mysql_result($result, $i, "rank"),     
       "amazon_price"   => mysql_result($result, $i, "amazon_used_price"), 
       "amazon_condition"  => mysql_result($result, $i, "amazon_used_condition"), 

       "lowest_price"   => mysql_result($result, $i, "lowest_used_price"), 
       "lowest_condition"  => "Used", 

       "margin"    => mysql_result($result, $i, "margin"), 

       "last_price_updated" => mysql_result($result, $i, "last_price_updated"), 
       "last_rank_updated"  => mysql_result($result, $i, "last_rank_updated") 
      ); 
     } 
    }  

    return $arr; 
} 

加入功能

/* returns profitable books */ 
function getProfitableBooks(){ 
    $new = $this->getProfitableBooksNew(); 
    $used = $this->getProfitableBooksUsed(); 

    if($new && $used){ 
     return array_merge($new, $used); 

    }else if($new){ 
     return $new; 

    }else if($used){ 
     return $used; 

    }else{ 
     return null; 
    } 
} 

任何人都可以給我至少一個如何解決這個問題的想法嗎?由於

+1

你可以使用['UNION'(http://dev.mysql.com/doc/refman/5.0/en/union.html)。只是不要'SELECT *' – Quantastical 2012-08-14 14:57:05

+1

使用'UNION'來結合兩個函數中的'$ q'。 – Kermit 2012-08-14 14:57:37

回答

3

你可以只UNION這兩個查詢到一個查詢這樣

SELECT *, 

    ROUND((amazon_new_price/100*80) - lowest_new_price,2) AS margin, 
    'new' AS type 

    FROM ".TBL_BOOKS." 

    WHERE rank < 200000 AND rank IS NOT NULL 
    AND lowest_new_price < amazon_new_price/100*80 
    AND amazon_new_price < 9999 
    AND ROUND((amazon_new_price/100*80) - lowest_new_price) > (lowest_new_price/100*".MARGIN.") 

UNION 

SELECT *, 

    ROUND((amazon_used_price/100*80) - lowest_used_price, 2) AS margin, 
    'used' as type 

    FROM ".TBL_BOOKS." 

    WHERE rank < 200000 AND rank IS NOT NULL 
    AND lowest_used_price < amazon_used_price/100*80 
    AND amazon_used_price < 9999 
    AND amazon_used_price < amazon_new_price 
    AND ROUND((amazon_used_price/100*80) - lowest_used_price) > (lowest_used_price/100*".MARGIN.") 

ORDER BY type ASC, rank ASC 

注意我添加一個字段「類型」來給你一個方法的新的和用過的結果區分開來。

+0

謝謝,我會給它一個機會, +1類型字段 – 2012-08-14 15:02:38

1

您可以使用UNION語法

$sql = "(SELECT a FROM t1 WHERE a=10 AND B=1) 
UNION 
(SELECT a FROM t2 WHERE a=11 AND B=2) ORDER BY a LIMIT 10; 
相關問題