Reputation: 2742
Im having trouble combining two MySQL statements into one, at the moment im having to run them each and then placing them into an array and then merging those arrays.
here are the the functions
1st function
/* 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;
}
2nd function
/* 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;
}
join function
/* 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;
}
}
Can anyone give me atleast an idea of how to approach this problem? Thanks
Upvotes: 1
Views: 120
Reputation: 2233
You can use UNION syntax
$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;
Upvotes: 1
Reputation: 71422
You could just UNION those two queries into a single query like this
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
Note I have added a field 'type' to give you a way to differentiate between the new and used results.
Upvotes: 3