PHP MySQL 输出两条 SQL Select 语句

标签 php mysql

我有以下两个查询,我想将它们组合成一个,日期是第一列。我遇到的问题是子查询的条件不同,第二个查询可能没有每个月的值。我一直在不同的页面上运行它们,因此这两个页面上的 AS num_custs 是相同的。

我用 SQL 尝试过几种不同的方法,但到目前为止都失败了。我最初的想法是在 SQL 中使用 UNION 但那没有用。我认为尝试用 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

最佳答案

您提到您想要日期作为第一个结果,您可以指定所有字段或仅将其添加在前面。

如果您使用 PHP 构建查询,您可以轻松地注入(inject)额外条件。

条件将被插入到 sprintf function 中的“%s”位置.

    // 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
    );

我希望我正确地解释了你的问题。

关于PHP MySQL 输出两条 SQL Select 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33412928/

相关文章:

php - '(value)' 中的未知列 'field list'

php - 检测列值结果的第一次变化

mysql - Duplicate Column Name 错误 MySQL 多个子查询

php - 如何从两个或多个表中删除记录

php - 如何将目标 ="_blank"属性实现到 PHP 链接中,以便在新选项卡中打开链接?

javascript - PHP和JS帮助: function doesn't accept arguments pasted with echo

mysql - 更改整个数据库中的数据类型

mysql - 如何按用户帐户过滤mysql审计日志

javascript - 如何在javascript中处理html数组元素并使用ajax将它们传递给 Controller

php - 如何统计数据库中的条目总数