单个查询中的多个 MySQL 计数
Multiple MySQL count in a single query
目前我有多个查询,1 想将其合并为一个,它们是相同的,只是日期范围在变化:
查询 1 :
SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-08-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-08-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))
查询 2 :
SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-09-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-09-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))
查询 3 :
SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-10-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-10-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))
我希望将这些查询合并为一个,结果是 3 行,每个计数的结果合而为一。
例如我会得到:
182
183
194
感谢您的帮助
具有where
中的共同条件并在日期范围内有条件地聚合。
请注意@Tim 在评论中提到的内容。如果计数必须互斥,请在 case
表达式中包含 meta_value
的范围。
SELECT COUNT(CASE WHEN simp_postmeta.meta_value > '2018-08-01 23:33:51'
THEN simp_posts.ID END)
,COUNT(CASE WHEN simp_postmeta.meta_value > '2018-09-01 23:33:51'
THEN simp_posts.ID END)
,COUNT(CASE WHEN simp_postmeta.meta_value > '2018-10-01 23:33:51'
THEN simp_posts.ID END)
FROM simp_posts
INNER JOIN simp_postmeta ON simp_posts.ID = simp_postmeta.post_id
WHERE simp_postmeta.meta_key = '_schedule_end'
AND simp_posts.post_status IN ('wc-active','wc-pending-cancel')
在 MySQL 中,您可以使用带有布尔值的 SUM()
来简化答案。
你的逻辑很复杂。我认为它减少到:
SELECT SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-09-01 23:33:51'),
SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:33:51'),
SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:33:51')
FROM simp_posts p INNER JOIN
simp_postmeta pm
ON p.ID = pm.post_id
WHERE pm.meta_key = '_schedule_end' AND
p.post_status IN ('wc-active', 'wc-pending-cancel')
目前我有多个查询,1 想将其合并为一个,它们是相同的,只是日期范围在变化:
查询 1 :
SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-08-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-08-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))
查询 2 :
SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-09-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-09-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))
查询 3 :
SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-10-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-10-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))
我希望将这些查询合并为一个,结果是 3 行,每个计数的结果合而为一。 例如我会得到: 182 183 194
感谢您的帮助
具有where
中的共同条件并在日期范围内有条件地聚合。
请注意@Tim 在评论中提到的内容。如果计数必须互斥,请在 case
表达式中包含 meta_value
的范围。
SELECT COUNT(CASE WHEN simp_postmeta.meta_value > '2018-08-01 23:33:51'
THEN simp_posts.ID END)
,COUNT(CASE WHEN simp_postmeta.meta_value > '2018-09-01 23:33:51'
THEN simp_posts.ID END)
,COUNT(CASE WHEN simp_postmeta.meta_value > '2018-10-01 23:33:51'
THEN simp_posts.ID END)
FROM simp_posts
INNER JOIN simp_postmeta ON simp_posts.ID = simp_postmeta.post_id
WHERE simp_postmeta.meta_key = '_schedule_end'
AND simp_posts.post_status IN ('wc-active','wc-pending-cancel')
在 MySQL 中,您可以使用带有布尔值的 SUM()
来简化答案。
你的逻辑很复杂。我认为它减少到:
SELECT SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-09-01 23:33:51'),
SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:33:51'),
SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:33:51')
FROM simp_posts p INNER JOIN
simp_postmeta pm
ON p.ID = pm.post_id
WHERE pm.meta_key = '_schedule_end' AND
p.post_status IN ('wc-active', 'wc-pending-cancel')