我有条目和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,如果它有任何其他更简单的方法来实现这一点,请告诉我。谢谢!
答案 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',
)),
)