[英]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.