2013-10-11 5 views
0

Целью этого вопроса является просто узнать, как делать вложенные запросы в MYSQL.Вложенные запросы MYSQL

1) Что не так в следующем запросе?

"SELECT tblwriter.writer_alias, tblwriter.writer_first_name, COUNT(tblordersub.suborder_alias) AS totalOrders FROM tblwriter, tblordersub WHERE tblwriter.writer_isactive = 1 AND tblordersub.writer_alias = tblwriter.writer_alias" 

2) Может ли быть лучшее решение для следующего гнезда запросов MYSQL?

$currentorders = $db->rawQuery("SELECT order_title,order_alias FROM tblorder WHERE company_id=? AND YEAR(order_date) = YEAR(CURDATE()) AND MONTH(order_date) = MONTH(CURDATE())",$params); 
$orderssummary = array(); 
if(!empty($currentorders)){ 
    foreach($currentorders as $corder){ 
     $param = array($corder["order_alias"]); 
     $oprice = $db->rawQuery("SELECT payment_amount FROM tblpayment WHERE payment_status = 1 AND writer_alias IS NULL AND order_alias=?",$param); 
     $itssuborders = $db->rawQuery("SELECT suborder_alias FROM tblordersub WHERE order_alias=?",$param); 
     $thesuborders = array_implode("",",",$itssuborders); 
     $cost = $db->rawQuery("SELECT SUM(payment_amount) AS total_subtotal FROM tblpayment WHERE writer_alias IS NOT NULL AND suborder_alias IN (".$thesuborders.")"); 
     $orderssummary[] = array("title"=>$corder["order_title"],"price"=>$oprice[0]["payment_amount"],"cost"=>$cost[0]["total_subtotal"]); 
    } 
} 

3) Есть ли способ объединить следующие три запроса в 1?

"SELECT SUM(payment_amount) AS totalAmount FROM tblpayment WHERE company_id=? AND payment_status = 1 AND order_alias IS NOT NULL AND YEAR(payment_add_datetime) = YEAR(CURDATE()) AND MONTH(payment_add_datetime) = MONTH(CURDATE() - INTERVAL 2 MONTH)" 
"SELECT SUM(payment_amount) AS totalAmount FROM tblpayment WHERE company_id=? AND payment_status = 0 AND writer_alias IS NOT NULL AND YEAR(payment_add_datetime) = YEAR(CURDATE()) AND MONTH(payment_add_datetime) = MONTH(CURDATE() - INTERVAL 2 MONTH)" 
"SELECT SUM(payment_amount) AS totalAmount FROM tblpayment WHERE company_id=? AND payment_status = 1 AND writer_alias IS NOT NULL AND YEAR(payment_add_datetime) = YEAR(CURDATE()) AND MONTH(payment_add_datetime) = MONTH(CURDATE() - INTERVAL 2 MONTH)" 

4) То же, что и второй вопрос, есть ли способ объединить следующие запросы в один запрос?

$biggest_customers = $db->rawQuery("SELECT payment_user_id, SUM(payment_amount) AS totalEARNED FROM tblpayment WHERE writer_alias IS NULL AND order_alias IS NOT NULL GROUP BY payment_user_id ORDER BY totalEARNED DESC LIMIT 10"); 
for($i=0;$i<count($biggest_customers);$i++){ 
    $params = array($biggest_customers[$i]["payment_user_id"]); 
    $customerinformation = $db->rawQuery('SELECT customer_alias FROM tblcustomer WHERE user_id=?',$params); 
    $biggest_customers[$i]["customer_alias"] = $customerinformation[0]["customer_alias"]; 
    unset($biggest_customers[$i]["payment_user_id"]); 
} 

Надеюсь узнать что-то!

+1

первый запрос: no группа. и я думаю, что вы запрашиваете больше о соединениях, чем вложенные запросы –

+0

и, пожалуйста, используйте явный синтаксис JOIN. На самом деле, прежде чем идти слишком много дальше, вам действительно нужно пройти курс крушения в JOINs. Они очень легки и важны для повышения производительности. – Strawberry

ответ

2
  1. См агрегатный запросов
  2. См JOIN и
  3. См заявления КОРПУСА/ОСИ СТОЛ запросов
  4. См РЕГИСТРИРУЙТЕСЬ снова
0

вы не можете использовать COUNT() заявление (агрегация запроса) без GROUP BY при выборе нескольких столбцов. Вы также должны использовать оператор объединения для выбора значений из разных таблиц. Что-то вроде этого, может быть:

SELECT tblwriter.writer_alias, tblwriter.writer_first_name, COUNT(tblordersub.suborder_alias) AS totalOrders 
FROM tblwriter 
INNER JOIN tblordersub ON (tblordersub.writer_alias = tblwriter.writer_alias) 
WHERE tblwriter.writer_isactive = 1 
GROUP BY tblordersub.suborder_alias 

только с помощью FROM tblwriter, tblordersub в запросе вы создаете перекрестное соединение, которое является cartesian product данных в ваших таблицах. Вы, вероятно, этого не хотите.

Смежные вопросы