[英]PHP MySQL outputting two SQL Select Statements
我想將以下兩個查詢合並為一個,其中日期為第一列。 我遇到的問題是子查詢的條件不同,第二個查詢可能沒有每個月的值。 我一直在不同的頁面上運行它們,因此為什么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構建查詢,則可以輕松注入額外條件。
該條件將插入sprintf函數中的“%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
);
希望我能正確解釋您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.