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