2014-11-21 2 views
0

, как показано ниже, я выбираю два разных столбца (count_group и group_total) с одинаковой таблицей и условием. Я чувствую, что этот метод делает страницу медленной. Любое предложение?Mysql Выберите два столбца в другой таблице

$sql3 = "SELECT SUM(mr.payment_amount) as total , 
COUNT(mr.order_id) as count_personal , 

(SELECT COUNT(DISTINCT mr.group_order_id) 
FROM event_mgmt_registration mr 
WHERE mr.event_nid = ".$nid." 
AND mr.status='completed' 
AND DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= '".$Sum['latest_date']."' 
AND mr.group_order_id != '') as count_group , 

(SELECT SUM(mr.payment_amount) 
FROM event_mgmt_registration mr 
WHERE mr.event_nid = ".$nid." 
AND mr.status='completed' 
AND DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= '".$Sum['latest_date']."' 
AND mr.group_order_id != '') as group_total 

FROM event_mgmt_registration mr 
WHERE mr.event_nid =".$nid." 
AND mr.status='completed' 
AND DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= '".$Sum['latest_date']."' 
AND mr.order_id !=''"; 
+1

Что объясняет 'объяснение' для вашего запроса? –

+0

Ну, а вы просто ЧУВСТВУЕТЕ, что это делает вашу страницу медленной, или она на самом деле не слишком медленная? Измерить каждый запрос сам по себе и предоставить информацию о времени выполнения, используйте EXPLAIN, чтобы получить правильную информацию о том, как MySQL выполняет ваш запрос. – MatsLindh

ответ

0

Для лучшей производительности ваш лучше сделать союзный, чтобы получить три результата как линии каждые:

SELECT 
SUM(mr.payment_amount) as total , 
COUNT(mr.order_id) as count_personal 
FROM event_mgmt_registration mr 
WHERE mr.event_nid =".$nid." 
AND mr.status='completed' 
AND DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= '".$molpaySum['latest_date']."' 
AND mr.order_id !='' 

UNION ALL 

(SELECT NULL, COUNT(DISTINCT mr.group_order_id) 
FROM event_mgmt_registration mr 
WHERE mr.event_nid = ".$nid." 
AND mr.status='completed' 
AND DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= '".$molpaySum['latest_date']."' 
AND mr.group_order_id != '') 

UNION ALL 

(SELECT NULL, SUM(mr.payment_amount) 
FROM event_mgmt_registration mr 
WHERE mr.event_nid = ".$nid." 
AND mr.status='completed' 
AND DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= '".$Sum['latest_date']."' 
AND mr.group_order_id != '') 
+0

$ query3 = db_query ($ sql3); $ Сумма = $ query3-> fetchAssoc(); $ result = $ howeiSum ['count_group']; ОШИБКА: Неопределенный индекс: count_group, извините, проблема объединения, которая не может определить count_group и group_total? total и count_personal is fine –

+0

Попробуйте мой обновленный ответ. – Benvorth

+0

Я понимаю, что объединение использует только первое имя столбца select, поэтому group_order_id и payment_amount находятся под общей и count_personal ... Спасибо за метод union –

0

Зачем вам нужен запрос для каждых пар? Вы можете сделать это с одним запросом я думаю

попробовать этот

$sql3 = " 
    SELECT 
     SUM(mr.payment_amount) as total , 
     COUNT(mr.order_id) as count_personal , 
     COUNT(DISTINCT mr.group_order_id) as count_group, 
     SUM(mr.payment_amount) as group_total 

    FROM event_mgmt_registration mr 

    WHERE 
     mr.event_nid =".$nid." AND 
     mr.status='completed' AND 
     DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= 
      '".$molpaySum['latest_date']."' AND 
     mr.order_id !='' 
"; 

Обратите внимание, что в group_total использовании $Sum['latest_date'] но не $molpaySum['latest_date']. Если это не опечатка, вы должны сохранить этот запрос, например:

$sql3 = " 
    SELECT 
     SUM(mr.payment_amount) as total , 
     COUNT(mr.order_id) as count_personal , 
     COUNT(DISTINCT mr.group_order_id) as count_group, 
     (SELECT SUM(mr.payment_amount) 
     FROM event_mgmt_registration mr 
     WHERE mr.event_nid = ".$nid." 
      AND mr.status='completed' 
      AND DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= 
       '".$Sum['latest_date']."' 
      AND mr.group_order_id != '' 
     ) as group_total 

    FROM event_mgmt_registration mr 

    WHERE 
     mr.event_nid =".$nid." AND 
     mr.status='completed' AND 
     DATE_FORMAT(FROM_UNIXTIME(`datestamp`), '%Y-%m-%d') <= 
      '".$molpaySum['latest_date']."' AND 
     mr.order_id !='' 
"; 
Смежные вопросы