MYSQL - 如何根据另一个表中的值汇总一个表中的数据?

时间:2014-05-13 01:25:26

标签: mysql sql join

我有3张桌子。一个叫用户存储用户名称的用户。另一个存储它的帖子(帖子类型,日期等)。第3个表可以根据帖子的类型存储不同的元键和值。 我想总结每个用户的帖子,例如: 有一个名字,后跟元标记和与他的帖子相关的值。

很难找到一些多连接,但一整天都失败了。

我的表格符合以下链接:http://sqlfiddle.com/#!8/cc7cd/2/0http://sqlfiddle.com/#!8/cc7cd/3/0

我想要一个返回愚弄结果的查询(示例显示一行,但每个日期可能有一行):

User display name      date (meta-key = data_de_inicio_do_servico)   date (meta-key = turno )        number of days (count number of instances that each user was found in that meta_key = data_de_inicio_do_servico)

1S BMT LEVI José da Silva Melo         07/05/2014                     06:45 às 15:45                                              1

2 个答案:

答案 0 :(得分:0)

只是为了澄清一下,您是否尝试在这三个查询之间创建联合?而不是加入?

例如,

select 
    wp_posts.ID
    , wp_postmeta.meta_key
    , wp_postmeta.meta_value
from wp_posts
LEFT JOIN wp_postmeta
    ON wp_postmeta.post_id = wp_posts.ID
where
    wp_posts.post_type like '%_an' AND
    (wp_postmeta.meta_key = 'data_de_inicio_do_servico' OR
    wp_postmeta.meta_key = 'turno') AND
    wp_postmeta.meta_value not like ''
union all
select 
    wp_postmeta.post_id as ID,
    wp_postmeta.meta_key , 
    wp_postmeta.meta_value 
from wp_postmeta 
where (wp_postmeta.meta_key like '%ATCO%' or wp_postmeta.meta_key like 'operador%') 
AND wp_postmeta.meta_value in (select wp_users.display_name from wp_users)

答案 1 :(得分:0)

首先,我可以轻松获得前两个,但为了便于阅读,略微简化了别名。 wp_POSTS表为“p”,第一个后元数据表为“pm1”,第二个为“pm2”。 最后的“pm3”是一点点的努力...我将用户表的“AND IN”更改为左连接...但是如果你只想要那些,那么你可以将它改为JOIN与“users”表关联,因为pm3别名将指示。

这可能与您正在寻找的内容非常接近。

SELECT
      p.ID,
      pm1.meta_key AS 'Date of duty', 
      pm1.meta_value AS 'Date',
      pm2.meta_key AS 'Turn of duty', 
      pm2.meta_value AS 'Turn',
      pm3.meta_key AS 'Operator', 
      pm3.meta_value AS 'Name'
   from 
      wp_posts p
         LEFT JOIN wp_postmeta pm1
            ON p.ID = pm1.post_id
           AND pm1.meta_key = 'data_de_inicio_do_servico'
           AND pm1.meta_value not like ''

         LEFT JOIN wp_postmeta pm2
            ON p.ID = pm2.post_id
           and pm2.meta_key = 'turno'
           AND pm2.meta_value not like ''

         LEFT JOIN wp_postmeta pm3
            ON p.ID = pm3.post_id
           and (    pm3.meta_key like '%ATCO%' 
                 or pm3.meta_key like 'operador%' )
           LEFT JOIN wp_users u
              ON wp3.meta_value = u.display_name
   where
      p.post_type like '%_an' 
   order by 
      p.post_date DESC

为了帮助优化查询,我会有一个索引 wp_posts表(post_type,post_date,id) wp_postmeta表(post_id,meta_key) wp_users表(display_name)(如果你真的需要保留这个)