Php MySQL,将id相同的多行分组
我继承了一个可爱的模式,它有三个字段:Php MySQL,将id相同的多行分组,php,mysql,sql,Php,Mysql,Sql,我继承了一个可爱的模式,它有三个字段:id、field\u name、field\u value。现在,您可能可以看到这将如何工作,对于通过CMS添加的每个字段,它将作为新行添加,而id值不是唯一的 但每个字段不是一个单独的实体,它们实际上应该按id(它引用提交的表单实例)分组。作为补充说明,我想知道这个模式模式可以被称为什么 //example db contents 1 name Joe Blogs 1 email joe@example.com 1
id、field\u name、field\u value
。现在,您可能可以看到这将如何工作,对于通过CMS添加的每个字段,它将作为新行添加,而id值不是唯一的
但每个字段不是一个单独的实体,它们实际上应该按id(它引用提交的表单实例)分组。作为补充说明,我想知道这个模式模式可以被称为什么
//example db contents
1 name Joe Blogs
1 email joe@example.com
1 programme sport
2 name Dave
2 email dave@example.com
2 programme art
当然,我真的希望使用一个查询来获得按id字段分组的选定字段。输出为array(id=>array('field'=>value','field'=>value'))
etc
通常我会做下面的工作,但我想知道是否有一种纯SQL的方法来完成这项工作,即在底部切断循环和处理
$existing = new stdClass;
$sql = "SELECT 'id','field_name','field_value'
FROM table_name";
$results = $wpdb->get_results( $sql, ARRAY ); //using wordpress btw
foreach ( $results as $k=>$r )
$existing[$r['id']][$k] = $r;
您可以使用聚合函数和大小写来透视值
SELECT ID,
MAX(CASE WHEN type = 'name' THEN value ELSE NULL end) Name,
MAX(CASE WHEN type = 'email' THEN value ELSE NULL end) email,
MAX(CASE WHEN type = 'programme' THEN value ELSE NULL end) programme
FROM table1
GROUP BY ID
或者将来,如果您计划在不更改查询的情况下添加其他类型,则可以使用准备好的语句
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN type = ''',
type,
''' then value ELSE NULL end) AS ',
type
)
) INTO @sql
FROM table1;
SET @sql = CONCAT('SELECT ID, ', @sql, '
FROM table1
GROUP BY ID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
您希望获得什么输出?数组(id=>array('name'=>value','email'=>value'))