Php 查询数据库并将每行的两列放入一个数组?

Php 查询数据库并将每行的两列放入一个数组?,php,mysql,Php,Mysql,我有一个带有表profile_值的sql数据库是的,它是一个Drupal db,我想通过一个查询提取用户名、标题和公司id。过去我用三个查询完成了这项工作,但我想用一个查询完成 | fid | uid | value | 4 | 100 | john | 8 | 100 | doe | 9 | 100 | web developer | 22 | 100 |

我有一个带有表profile_值的sql数据库是的,它是一个Drupal db,我想通过一个查询提取用户名、标题和公司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,这里有一种不需要switch语句或ifs的方法。它基于以前将表的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更改为,例如,2、6、29中的p1.uid

这是一种不需要switch语句或ifs的方法。它基于以前将表的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更改为,例如,2、6、29中的p1.uid

我会尝试以下方法:

$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


希望这有帮助,我会尝试以下方法:

$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


希望这有帮助

首先,您在查询中只选择了一列。我知道。这个例子很有效。我不知道如何将它们组合在一起,以实现我想要做的事情——即根据fid将值分配给变量,如firstname。首先,您在查询中只选择了一列。我知道。这个例子很有效。我不知道如何将它们组合在一起来完成我想做的事情-即根据fid将值分配给变量,例如firstname。我通读了您的解决方案和其他解决方案,并且之前使用过switch,这非常有意义!谢谢我通读了您的解决方案和其他解决方案,之前使用过switch,这非常有意义!谢谢与交换机相比有什么优势吗?我使用另一个是因为我理解得更清楚。只是稍微短一点,我个人觉得开关有点笨拙。如果您有15个字段而不是4个字段,那么这看起来会更干净。但这是个人选择的问题,如果更容易理解,请坚持使用switch。与switch相比有什么优势吗?我使用另一个是因为我理解得更清楚。只是稍微短一点,我个人觉得开关有点笨拙。如果您有15个字段而不是4个字段,那么这看起来会更干净。但这是个人选择的问题,如果更容易理解,请坚持使用开关。