在mysql中透视表

时间:2018-02-07 04:27:08

标签: php mysql wordpress

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

条目表:

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

entrymeta表:

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 Bussinessman

执行查询时:

$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] => Bussinessman
        )
)

我怎样才能改变这样的事情?

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] => Bussinessman
        )
)

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

2 个答案:

答案 0 :(得分:1)

您必须为要包含在结果中的每个键加入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'

答案 1 :(得分:1)

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

代码:(Demo

$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',
  )),
)