繁体   English   中英

mysql中的数据透视表

[英]Pivoting table in mysql

我有条目和条目元表结构。 id是主键, entry_id中的 entry_id 是条目表中 id 的外键。

条目表:

id created_at
1  2017-04-03
2  2017-07-05

条目元表:

id entry_id(foreign key to id) meta_key   meta_value
1  1                            Name       Smith
2  1                            Address    Saniply
3  1                            Profession Student
4  2                            Name       John
5  2                            Address    Aviero
6  2                            Profession Businessman

当我执行查询时:

$query =  'SELECT entry_id, created_at, meta_key, meta_value FROM entries INNER JOIN entrymeta WHERE entries.id = entrymeta.entry_id';
$wpdb->get_results( $query );

我得到的结果如下:

Array
(
    [0] => stdClass Object
        (
            [entry_id] => 1
            [created_at] => 2017-04-03
            [meta_key] => Name
            [meta_value] => Smith
        )

    [1] => stdClass Object
        (
            [entry_id] => 1
            [created_at] => 2017-04-03
            [meta_key] => Address
            [meta_value] => Saniply
        )

    [2] => stdClass Object
        (
            [entry_id] => 1
            [created_at] => 2017-04-03
            [meta_key] => Profession
            [meta_value] => Student
        )

    [3] => stdClass Object
        (
            [entry_id] => 2
            [created_at] => 2017-07-05
            [meta_key] => Name
            [meta_value] => John
        )

    [4] => stdClass Object
        (
            [entry_id] => 2
            [created_at] => 2017-07-05
            [meta_key] => Address
            [meta_value] => Aviero
        )

    [5] => stdClass Object
        (
            [entry_id] => 2
            [created_at] => 2017-07-05
            [meta_key] => Profession
            [meta_value] => Businessman
        )
)

我怎样才能实现这样的目标呢?

Array
(
    [0] => stdClass Object
        (
            [entry_id] => 1
            [created_at] => 2017-04-03
            [Name] => Smith
            [Address] => Saniply
            [Profession] => Student
        )

    [1] => stdClass Object
        (
            [entry_id] => 2
            [created_at] => 2017-07-05
            [Name] => John
            [Address] => Aviero
            [Profession] => Businessman
        )
)

我正在使用 wordpress,如果它有任何其他更简单的方法来实现这一点,请告诉我。 谢谢!

您必须为要包含在结果中的每个键加入 entrymeta 一次,这不是很可扩展。

SELECT
    e.*,
    m_name.meta_value Name,
    m_addr.meta_value Address,
    m_prof.meta_value Profession
FROM
    entries e
JOIN entrymeta m_name ON m_name.entry_id = e.id
    AND m_name.meta_key = 'Name'
JOIN entrymeta m_addr ON m_addr.entry_id = e.id
    AND m_addr.meta_key = 'Address'
JOIN entrymeta m_prof ON m_prof.entry_id = e.id
    AND m_prof.meta_key = 'Profession'

我正在将您的对象数组(结果集)写为$array 我的方法将分配临时键来合并重复的 entry-id 对象。 使用isset()意味着在迭代时不会发生不必要的值覆盖。

代码:(演示

$array=[
    (object)['entry_id'=>1,'created_at'=>'2017-04-03','meta_key'=>'Name','meta_value'=>'Smith'],
    (object)['entry_id'=>1,'created_at'=>'2017-04-03','meta_key'=>'Address','meta_value'=>'Saniply'],
    (object)['entry_id'=>1,'created_at'=>'2017-04-03','meta_key'=>'Profession','meta_value'=>'Student'],
    (object)['entry_id'=>2,'created_at'=>'2017-07-05','meta_key'=>'Name','meta_value'=>'John'],
    (object)['entry_id'=>2,'created_at'=>'2017-07-05','meta_key'=>'Address','meta_value'=>'Aviero'],
    (object)['entry_id'=>2,'created_at'=>'2017-07-05','meta_key'=>'Profession','meta_value'=>'Businessman']
];
foreach($array as $obj){                                 // iterate all objs
    $id=$obj->entry_id;                                  // cache for more readable code
    if(!isset($result[$id])){                            // first occurrence of entry_id
        $result[$id]=new \stdClass();                    // avoid Warning: Creating default object from empty value
        $result[$id]->entry_id=$id;                      // store entry_id
        $result[$id]->created_at=$obj->created_at;       // store created_at
    }
    $result[$id]->{$obj->meta_key}=$obj->meta_value;     // unconditionally store meta_key and meta_value
}
var_export(array_values($result));  // remove temporary indexes and display

输出:

array (
  0 => 
  stdClass::__set_state(array(
     'entry_id' => 1,
     'created_at' => '2017-04-03',
     'Name' => 'Smith',
     'Address' => 'Saniply',
     'Profession' => 'Student',
  )),
  1 => 
  stdClass::__set_state(array(
     'entry_id' => 2,
     'created_at' => '2017-07-05',
     'Name' => 'John',
     'Address' => 'Aviero',
     'Profession' => 'Businessman',
  )),
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM