我有一个带有“profile_values”表的SQL数据库(是的,它是一个Drupal数据库),我想用一个查询来提取用户的名字,标题和公司ID。 (我过去用三个查询做过这个,但我想在一个查询中完成。)
| fid | uid | value
| 4 | 100 | john
| 8 | 100 | doe
| 9 | 100 | web developer
| 22 | 100 | D3239GE77
我使用了不同的字段ID(fid)来表示我想要提取的行之间可以有字段ID,但字段ID不会改变,因此4将始终是名字,8将是姓氏, 9将是标题,22将是公司ID。
我的第一次尝试:
$result = mysql_query("SELECT value FROM profile_values WHERE uid = '$uid' ORDER BY fid ASC");
while($row = mysql_fetch_array($result)) {
$userinfo[] = $row['value'];
$firstname = $userinfo[0];
$lastname = $userinfo[1];
$title = $userinfo[10];
$companyid = $userinfo[12];
}
但是这种方法不起作用,因为根据用户填写的可选字段,可能会有更多或更少的字段。
我需要一种方式来说,“在这个数组中,如果fid = 4,$ firstname = value
答案 0 :(得分:0)
以下是一种不需要switch
语句或if
的方法。它基于一个数组,您先前将表fid
映射到目标数组上的键:
$fieldMap = array(
4 => 'firstname',
8 => 'lastname',
9 => 'title',
22 => 'companyid'
);
$userinfo = array();
$result = mysql_query("
SELECT fid, value
FROM profile_values
WHERE uid = $uid
ORDER BY fid ASC
");
while($row = mysql_fetch_array($result)) {
$fieldKey = $fieldMap[$row['fid']];
$userinfo[$fieldKey] = $row['value'];
}
以下是我的原始建议,我们将结果转换为“常规”表格格式,而不是属性表格式:
SELECT
p1.value AS first_name,
p2.value AS last_name,
p3.value AS title,
p4.value AS company_id
FROM profile_values p1
LEFT OUTER JOIN profile_values p2
ON p2.uid = p1.uid
AND p2.fid = 8
LEFT OUTER JOIN profile_values p3
ON p3.uid = p1.uid
AND p3.fid = 9
LEFT OUTER JOIN profile_values p4
ON p4.uid = p1.uid
AND p4.fid = 22
WHERE p1.uid = $uid AND p1.fid = 4
对于SQL来说,这比当前正在进行的方式更昂贵,但它可以让您更轻松地从多个用户获取数据(只需将p1.uid = $uid
更改为p1.uid IN (2, 6, 29)
即可。
答案 1 :(得分:0)
$result = mysql_query("SELECT fid, uid, value FROM profile_values WHERE uid = '$uid' ORDER BY fid ASC");
$user = array();
while ($row = mysql_fetch_array($result)) {
switch ($row['fid']) {
case 4:
$key = 'firstname';
break;
case 8:
$key = 'lastname';
break;
case 9:
$key = 'title';
break;
case 22:
$key = 'company_id';
break;
default:
continue 2; // 2 required when using switch inside loop
}
$user[$key] = $row['value'];
}
答案 2 :(得分:0)
我会尝试以下方法:
$result = mysql_query("SELECT fid, value FROM profile_values WHERE uid = '$uid' ORDER BY fid ASC");
while($row = mysql_fetch_assoc($result)) {
switch ((int)$row['fid']) {
case 4:
$firstname = $row['value'];
break;
case 8:
$lastname = $row['value'];
break;
case 9:
$title = $row['value'];
break;
case 22:
$companyid = $row['value'];
break;
}
}
然后,我将使用isset()
检查变量是否存在,例如isset($lastname)
希望这有帮助