我只是在学习mysql,所以这可能非常容易。
我有一个有3行的表,其中包含以下样本数据
user_id metakey meta_value
1 image_type avatar
1 location london
1 image_url 1.jpg
2 image_type facebook
2 location somewhere
2 image_url
如果我想要来自另一个metakey
的meta_value
数据,如何在不每次重新查询表的情况下获得meta_value
的值?
所以1->位置会显示伦敦2->图像类型会显示facebook等等
经过一番折腾,我最终来到了这里:
$query_usermeta = "SELECT * FROM usermeta WHERE user_id = '$user_id'" or die("Error in the consult.." . mysqli_error($link));
//execute the query.
$result_usermeta = mysqli_query($link, $query_usermeta);
/* associative array */
$userdatameta = $result_usermeta->fetch_array(MYSQLI_ASSOC);
然后选择echo $userdatameta['meta_value']
,但我如何指定要显示哪个meta_value?
我知道我可以在像WHERE metakey = 'location'
这样的mysql查询中做到这一点,但我必须多次查询才能获得所有值,不是吗?
不必对每一行运行查询,只需将数组构建为键值对,而只需通过用户id 进行查询
SELECT * FROM usermeta WHERE user_id = '$user_id'
循环查看您的结果
$metaData=array();
while($row = $result_usermeta->fetch_array())
{
$metaData[$row['metakey']] = $row['meta_value'];
}
现在在$metaData
中,您有作为键值对的值作为
array(
'image_type'=>'avatar',
'location' =>'london',
'image_url'=>'1.jpg'
)
现在使用您的值作为图像url echo $metaData['image_url']
的位置echo $metaData['location']
实现这一点的一种方法是进行透视,使元键成为返回的列名。
SELECT user_id,
CASE WHEN metakey = 'image_type' THEN meta_value END as image_type,
CASE WHEN metakey = 'location' THEN meta_value END as location,
CASE WHEN metakey = 'image_url' THEN meta_value END as image_url
FROM usermeta
WHERE user_id = '$user_id'
然后您可以通过元密钥选择元值
echo $userdatameta['location']