Mysql 将两个表(多个列和行)中的数据分组到一行中

Mysql 将两个表(多个列和行)中的数据分组到一行中,mysql,sql,Mysql,Sql,我试图将每一行上的key=value对分组为一行,并按ID分组 表1。wp_帖子 关键字:ID-发布标题 表2。wp_邮差 关键字:post_id、wpcf所有者、wpcf-电话、wpcf移动、wpcf电子邮件 使用此查询,我将获得所有信息,但对于每个键,我将获得单独的行。我需要的是一个数组,其中所有内容都在一行中,由wp_posts.ID分组 SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.post_id, wp_postmeta.me

我试图将每一行上的key=value对分组为一行,并按ID分组

表1。wp_帖子
关键字:ID-发布标题

表2。wp_邮差
关键字:post_id、wpcf所有者、wpcf-电话、wpcf移动、wpcf电子邮件

使用此查询,我将获得所有信息,但对于每个键,我将获得单独的行。我需要的是一个数组,其中所有内容都在一行中,由wp_posts.ID分组

SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.post_id, wp_postmeta.meta_key, wp_postmeta.meta_value
FROM wp_posts
JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'accommodation' AND wp_postmeta.meta_key LIKE 'wpcf%'
ORDER BY hic13_posts.post_title
结果是:

ID | post_title | key value  
------------------------------  
1  |  TITLE     |  wpcf-owner  
1  |  TITLE     |  wpcf-tel  
1  |  TITLE     |  wpcf-mob  
1  |  TITLE     |  wpcf-email  
2  |  TITLE     |  wpcf-owner  
2  |  TITLE     |  wpcf-tel  
2  |  TITLE     |  wpcf-mob  
2  |  TITLE     |  wpcf-email  
...
我需要的是:

ID | post_title | key value  | key value | key value | key value  
-----------------------------------------------------------------  
1  |  TITLE     | wpcf-owner | wpcf-tel  | wpcf-mob  | wpcf-email  
2  |  TITLE     | wpcf-owner | wpcf-tel  | wpcf-mob  | wpcf-email 
若我将命令添加到GROUPBYID,那个么我从第二个表中只得到一个键

SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.post_id, wp_postmeta.meta_key, wp_postmeta.meta_value
FROM wp_posts
JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'accommodation' AND wp_postmeta.meta_key LIKE 'wpcf%'    
GROUP BY hic13_posts.ID
ORDER BY hic13_posts.post_title
我只得到这个

ID | post_title | key value  
------------------------------  
1  |  TITLE     |  wpcf-owner  
2  |  TITLE     |  wpcf-tel 
希望所有这些都有意义:-)

谢谢大家!

这种类型的转换是pivot,但MySQL没有pivot函数,因此您需要将聚合函数与
CASE
表达式一起使用:

SELECT p.ID, 
  p.post_title, 
  m.post_id, 
  max(case when m.meta_key = 'wpcf-owner' then m.meta_value end) as owner,
  max(case when m.meta_key = 'wpcf-tel' then m.meta_value end) as tel,
  max(case when m.meta_key = 'wpcf-mob' then m.meta_value end) as mob,
  max(case when m.meta_key = 'wpcf-email' then m.meta_value end) as email
FROM wp_posts p
JOIN wp_postmeta m
  ON p.ID = m.post_id
WHERE p.post_type = 'accommodation' AND m.meta_key LIKE 'wpcf%'    
GROUP BY p.ID, p.post_title, m.post_id
ORDER BY p.post_title
编辑,如果要转换的
meta_key
项数量未知,则可以使用准备好的语句生成动态sql:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN m.meta_key = ''',
      meta_key,
      ''' THEN m.meta_value else null END) AS `',
      meta_key, '`'
    )
  ) INTO @sql
FROM wp_postmeta;

SET @sql 
  = CONCAT('SELECT p.ID, 
              p.post_title, 
              m.post_id, ', @sql, ' 
            FROM wp_posts p
            JOIN wp_postmeta m
              ON p.ID = m.post_id
            WHERE p.post_type = ''accommodation'' 
               AND m.meta_key LIKE ''wpcf%''   
            GROUP BY p.ID, p.post_title, m.post_id
            ORDER BY p.post_title');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

代码生成错误,但删除“part”和p.meta_键(如“wpcf%”)可以修复此错误。。。还有一件事,有没有一种方法可以不为每一个meta_密钥做一个理由,因为有很多meta_密钥,并使其成为未来的证明。所有的键都以“wpcf-”开头,因此我有这个部分和p.meta_键,比如“wpcf%”@ronimarin错误是因为我在where子句中的
meta_键上放置了错误的表别名。我还编辑了我的答案,以包含一个为未知数量的列生成动态sql的解决方案。非常感谢您,为了实现这一点,我已经学习了几个小时的sql;-)你确实帮我省了不少时间@ronimarin如果您在SQL Server中运行此代码,它将不起作用。@ronimarin此代码特定于MySQL,您必须在MySQL存储过程或MySQL的某种接口中运行它。