2

テーブル「profile_values」(はい、Drupal データベースです) を持つ SQL データベースがあり、ユーザーの名前、役職、および会社 ID を 1 つのクエリで取得したいと考えています。(過去に 3 つのクエリでこれを実行しましたが、1 つのクエリで実行したいと思います。)

|   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 = 値

4

3 に答える 3

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'];
}
于 2012-05-09T23:05:53.133 に答える
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)

お役に立てれば

于 2012-05-09T23:06:56.220 に答える
0

switchこれは、aステートメントまたは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たとえば、p1.uid IN (2, 6, 29).

于 2012-05-09T22:59:10.913 に答える