2012-08-14 118 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; 
相关问题