【问题标题】:Merge 2 SQL queries.合并 2 个 SQL 查询。
【发布时间】:2018-07-30 09:31:41
【问题描述】:

我正在编写(或者我应该说是重新编写)一个 Wordpress 插件。

我有这个查询使用 meta.key 打印年份、月份和总距离 pr 月份:'_rl_distance_value':

SELECT DATE_FORMAT( wp_posts.post_date, '%Y' ) AS Runyear, MONTH( wp_posts.post_date ) AS Runmonth, SUM( wp_postmeta.meta_value ) AS Distance
FROM wp_postmeta
INNER JOIN wp_posts ON ( wp_postmeta.post_id = wp_posts.id )
WHERE wp_postmeta.meta_key = '_rl_distance_value'
AND wp_posts.post_status = 'publish'
AND wp_postmeta.post_id = wp_posts.id
AND year(wp_posts.post_date)= '2010'
GROUP BY DATE_FORMAT( wp_posts.post_date, '%Y-%m' )

它会打印如下内容:

Runyear     Runmonth    Distance    
2010    1   76260
2010    2   88670
2010    3   106490
2010    4   57199
2010    5   66460
2010    6   84480
2010    7   54490
2010    8   45090
2010    9   27140
2010    10  70600
2010    11  51000

我也有这个查询来使用 meta.key 获取每个月运行的总时间:'_rl_time_value'

SELECT DATE_FORMAT( wp_posts.post_date, '%Y-%m' ) AS Runyear, MONTH( wp_posts.post_date ) AS Runmonth, ((SUM( time_to_sec( STR_TO_DATE( wp_postmeta.meta_value, '%T' ) ) ) )/3600) AS Runtimetotal
FROM wp_postmeta
INNER JOIN wp_posts ON ( wp_postmeta.post_id = wp_posts.id )
WHERE wp_postmeta.meta_key = '_rl_time_value'
AND wp_posts.post_status = 'publish'
AND year(wp_posts.post_date)= '2010'
GROUP BY DATE_FORMAT( wp_posts.post_date, '%Y-%m' )

它会打印如下内容:

Runyear     Runmonth    Runtimetotal    
2010-01     1   7.8928
2010-02     2   9.1667
2010-03     3   10.7083
2010-04     4   5.7497
2010-05     5   6.9561
2010-06     6   8.5594
2010-07     7   5.5767
2010-08     8   4.6139
2010-09     9   2.7233
2010-10     10  7.3953
2010-11     11  4.5858

如何合并这 2 个查询以获得这样的结构

Runyear     Runmonth    Distance    Runtimetotal 

我不知道该怎么做?

你能帮忙吗?

【问题讨论】:

  • 你可以加入 Runmonth、runyear 的结果吗? select A.*, B.Runtimetotal from A inner join B on A.Runmonth=B.Runmonth and A.Runyear=B.RunYear,
  • 你能做一个 sqlfiddle.com 吗?

标签: mysql sql wordpress


【解决方案1】:

我认为你可以只使用条件聚合:

SELECT DATE_FORMAT( p.post_date, '%Y-%m' ) AS Runyear,
       MONTH( p.post_date ) AS Runmonth,
       SUM(CASE WHEN pm.meta_key = '_rl_distance_value' THEN wp_postmeta.meta_value END) AS Distance,          
       SUM(time_to_sec(STR_TO_DATE(CASE WHEN pm.meta_key = '_rl_time_value' THEN pm.meta_value END, '%T')))/3600 AS Runtimetotal
FROM wp_postmeta pmm INNER JOIN
     wp_posts p
     ON pm.post_id = p.id
WHERE pm.meta_key IN ('_rl_distance_value', '_rl_time_value') AND
      p.post_status = 'publish' AND
      year(p.post_date)= 2010
GROUP BY DATE_FORMAT(p.post_date, '%Y-%m' )

【讨论】:

  • 感谢您的回答。当我尝试在 phpmyadmin 中运行该查询时 - 我收到一些错误静态分析:分析期间发现 49 个错误。之前发现了一个别名。 (在位置 100 的“Runmonth”附近)预期有别名。 (靠近位置 99 的“”)意外标记。 (在位置 100 的“Runmonth”附近)意外标记。 (在位置 108 的“,”附近)无法识别的关键字。 (在位置 118 的“SUM”附近)意外的令牌。 (靠近位置 121 的“(”)无法识别的关键字。(靠近位置 122 的“CASE”)...对不起,如果我是新手...
  • 我无法编辑,在第一行的 Runyear 之后缺少“,”。但这修复了我仍然得到一个错误。 SQL query: Documentation .... MySQL said: Documentation #1054 - Unknown column 'pm.meta_key' in 'field list'你还能看出什么问题吗?
【解决方案2】:

试试这个:

SELECT DATE_FORMAT( wp_posts.post_date, '%Y-%m' ) AS Runyear, MONTH( wp_posts.post_date ) AS Runmonth, 
((SUM( case when (wp_postmeta.meta_key = '_rl_time_value' then time_to_sec( STR_TO_DATE( wp_postmeta.meta_value, '%T' ) ) ) else 0 end )/3600) AS Runtimetotal, SUM( case when p_postmeta.meta_key = '_rl_distance_value' then wp_postmeta.meta_value else 0) AS Distance
FROM wp_postmeta
INNER JOIN wp_posts ON ( wp_postmeta.post_id = wp_posts.id )
WHERE (wp_postmeta.meta_key = '_rl_time_value' ||wp_postmeta.meta_key = '_rl_distance_value')
AND wp_posts.post_status = 'publish'

AND year(wp_posts.post_date)= '2010'
GROUP BY DATE_FORMAT( wp_posts.post_date, '%Y-%m' )

解释:如果key是time_value,对于runtime,你加时间,对于距离你加0。也就是说结果不会改变。 distance_value 也一样。

或者,您可以:

select A.*, B.Runtimetotal 
from A 
inner join B on A.Runmonth=B.Runmonth and A.Runyear=B.RunYear;

其中 A 和 B 是查询的结果

【讨论】:

    【解决方案3】:

    在下面使用左右连接和联合sudo查询

    select t1.*,t2.Runtimetotal from your_1stQuery_output as t1
    left join your_2ndQuery_output as t2
    on t1.Runyear=t2.Runyear and t1.Runmonth=t2.Runmonth
    union
    select t2.*,t1.Distance from your_1stQuery_output as t1
    right join your_2ndQuery_output as t2
    on t1.Runyear=t2.Runyear and t1.Runmonth=t2.Runmonth
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多