2015-10-29 3 views
2

У меня есть следующие два Запроса, которые я хотел бы объединить в один с датой первого столбца. Проблема, с которой я сталкиваюсь, заключается в том, что условия подзапроса различны, а второй запрос может не иметь значения для каждого месяца. Я запускаю их на разных страницах, поэтому AS num_custs одинаково для обоих.PHP MySQL, выводящий две инструкции SQL Select

Я пробовал пару разных вещей с SQL, но до сих пор не удалось. Мои первоначальные мысли заключались в использовании UNION в SQL, но это не сработало. Я думаю, что я нахожусь на правильном пути, пытаясь сделать это в SQL, а не в PHP.

Первый вопрос: какую команду SQL я должен использовать для достижения этого?

Надеюсь, что все имеет смысл.

Запрос 1:

  SELECT * , COUNT(entity_id) AS num_custs 
       FROM (

       SELECT e. * , e.created_at AS abc123, o.status, o.total_invoiced, o.shipping_description, o.subtotal_incl_tax, MAX(o.created_at) AS last_order_date 
       FROM mg_customer_entity AS e 
       LEFT JOIN mg_sales_flat_order AS o ON o.customer_id = e.entity_id 
       WHERE e.entity_type_id = '1' 
       AND o.status NOT LIKE 'canceled' 
       AND o.status NOT LIKE 'closed' 
       AND o.status NOT LIKE 'fraud' 
       AND o.status NOT LIKE 'holded' 
       AND o.status NOT LIKE 'paypal_canceled_reversal' 
       AND e.store_id 
       BETWEEN 1 
       AND 2 
       AND o.total_invoiced IS NOT NULL 
       AND o.subtotal_incl_tax IS NOT NULL 

       GROUP BY e.entity_id 
       HAVING last_order_date IS NOT NULL 

       )sub_query 
       GROUP BY YEAR(abc123) , MONTH(abc123) 
       ORDER BY abc123 DESC 

Запрос 2:

  SELECT * , COUNT(entity_id) AS num_custs 
       FROM (

       SELECT e. * , e.created_at AS abc123, o.status, o.total_invoiced, o.shipping_description, o.subtotal_incl_tax, MAX(o.created_at) AS last_order_date 
       FROM mg_customer_entity AS e 
       LEFT JOIN mg_sales_flat_order AS o ON o.customer_id = e.entity_id 
       WHERE e.entity_type_id = '1' 
       AND o.status NOT LIKE 'canceled' 
       AND o.status NOT LIKE 'closed' 
       AND o.status NOT LIKE 'fraud' 
       AND o.status NOT LIKE 'holded' 
       AND o.status NOT LIKE 'paypal_canceled_reversal' 
       AND e.store_id 
       BETWEEN 1 
       AND 2 
       AND o.total_invoiced IS NOT NULL 
       AND o.subtotal_incl_tax IS NOT NULL 

       GROUP BY e.entity_id 
       HAVING last_order_date >= DATE_SUB(CURDATE() , INTERVAL 91 DAY) 
       AND last_order_date IS NOT NULL 

       )sub_query 
       GROUP BY YEAR(abc123) , MONTH(abc123) 
       ORDER BY abc123 DESC 

ответ

0

Вы сказали, что вы хотели дату в качестве первого результата, вы можете либо указать все поля или просто добавить его в передней.

Если вы создаете запрос на PHP, вы можете легко ввести дополнительное условие.

Условие будет вставлено в положение «% s» в поле sprintf function.

// set $limit_order_date depending on the page 

    $having = ''; 

    if (true === $limit_order_date) { 
     $having = 'AND last_order_date >= DATE_SUB(CURDATE() , INTERVAL 91 DAY)'; 
    } 


    $sql = sprintf(" 
     SELECT abc123, 
       * , 
       COUNT(entity_id) AS num_custs 
      FROM (
      SELECT e. *, 
        e.created_at AS abc123, 
        o.status, 
        o.total_invoiced, 
        o.shipping_description, 
        o.subtotal_incl_tax, 
        MAX(o.created_at) AS last_order_date 
       FROM mg_customer_entity AS e 
     LEFT JOIN mg_sales_flat_order AS o 
       ON o.customer_id = e.entity_id 
      WHERE e.entity_type_id = '1' 
       AND o.status NOT LIKE 'canceled' 
       AND o.status NOT LIKE 'closed' 
       AND o.status NOT LIKE 'fraud' 
       AND o.status NOT LIKE 'holded' 
       AND o.status NOT LIKE 'paypal_canceled_reversal' 
       AND e.store_id BETWEEN 1 AND 2 
       AND o.total_invoiced IS NOT NULL 
       AND o.subtotal_incl_tax IS NOT NULL 
      GROUP BY e.entity_id 
      HAVING last_order_date IS NOT NULL %s 
       )sub_query 
    GROUP BY YEAR(abc123), 
       MONTH(abc123) 
    ORDER BY abc123 DESC", 
     $having 
    ); 

Надеюсь, я правильно истолковал ваш вопрос.

+0

спасибо за ваш ответ, что произойдет, если у вас было более одного доллара? это возможно? Также как бы вы проходили через каждую строку? –

+0

У вас может быть оператор select или несколько операторов if, которые собирают условия «наличия» в массив '$, имеющий [] =« И НЕКОТОРЫЕ СОСТОЯНИЯ »;' которые вы можете комбинировать с '$ having_string = implode ('', $, имеющим) ' – moorscode

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