Вместо циклирования каждый раз в php это может быть сделано в хранимой процедуре, поскольку для этого требуется слишком много времени для выполнения кода [duplicate]

Цель этого вопроса - узнать, как делать вложенные запросы в 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"]);
}

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

0
задан 11 October 2013 в 21:23

1 ответ

вы не можете использовать оператор 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 в вашем запросе, вы создаете кросс-соединение, которое является декартовым произведением данных в ваших таблицах. Вы, вероятно, этого не хотите.

0
ответ дан 15 August 2018 в 15:48

Другие вопросы по тегам:

Похожие вопросы: