1

PHP でこのクエリを実行し、arrayこれからそれぞれ 2 つのキーを持つ 2 つのレコードを取得します。array一意のレコードを抽出する必要があります。このクエリを作成し、配列から一意のレコードを抽出するより専門的な方法はありますか?

PS position1positions2テーブルは同一です。そのためposition1、そのうちの 1 つを削除できます。

$get_positions = "SELECT positions1.pos_id1,
                         positions1.pos_name1,
                         positions2.pos_id2,
                         positions2.pos_name2
                      FROM employees
                          LEFT JOIN positions1 ON positions1.pos_id1 = employees.position1
                          LEFT JOIN positions2 ON positions2.pos_id2 = employees.position2
                              WHERE employees.status IN (1,2)
                                  GROUP BY pos_name2
                                      ORDER BY pos_id2 ASC";
$positions_res = $sql->RunSQL($get_positions, "select");

$positions_res のダンプ

array(2) {
  [0]=>
  array(8) {
    [0]=>
    string(1) "4"
    ["pos_id1"]=>
    string(1) "4"
    [1]=>
    string(27) "Driver"
    ["pos_name1"]=>
    string(27) "Driver"
    [2]=>
    string(1) "2"
    ["pos_id2"]=>
    string(1) "2"
    [3]=>
    string(9) "Cook"
    ["pos_name2"]=>
    string(9) "Cook"
  }
  [1]=>
  array(8) {
    [0]=>
    string(2) "19"
    ["pos_id1"]=>
    string(2) "19"
    [1]=>
    string(23) "Guard"
    ["pos_name1"]=>
    string(23) "Guard"
    [2]=>
    string(2) "19"
    ["pos_id2"]=>
    string(2) "19"
    [3]=>
    string(23) "Guard"
    ["pos_name2"]=>
    string(23) "Guard"
  }
}

コードは続く

$pos_list = array();
$i = 0;
for ($n = 0; $n < count($positions_res); $n++) {

    if ($positions_res[$n]["pos_name1"] == $positions_res[$n]["pos_name2"]) {
        $pos_list[$i]["id"] = $positions_res[$n]["pos_id1"];
        $pos_list[$i]["name"] = $positions_res[$n]["pos_name1"];
        $i++;
    } else {
        $pos_list[$i]["id"] = $positions_res[$n]["pos_id1"];
        $pos_list[$i]["name"] = $positions_res[$n]["pos_name1"];
        $i++;
        $pos_list[$i]["id"] = $positions_res[$n]["pos_id2"];
        $pos_list[$i]["name"] = $positions_res[$n]["pos_name2"];
        $i++;
    }
}

var_dump($pos_list);

最終結果のダンプ

array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    string(1) "4"
    ["name"]=>
    string(27) "Driver"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(1) "2"
    ["name"]=>
    string(9) "Cook"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(2) "19"
    ["name"]=>
    string(23) "Guard"
  }
}

編集:

従業員 position1 および position2 に割り当てられたすべてのポジションの一意のポジション (pos_id、pos_name) のリストを取得する必要があります (ステータス 1 および 2 の従業員の場合)。

たとえば、従業員

ジョンにはposition1=Driver,position2=Driver従業員 サムにはPoition1=Driver,Position2=Guard 従業員には マイク がいるPosition1=CookのでPosition2=Driver 、この場合は選択する必要があります

リスト:

4,  Driver
19, Guard
2,  Cook
4

2 に答える 2

0

位置1と位置2が1つの位置テーブルのコピーであると仮定すると、クエリを次のように変更します。

SELECT 
    p.pos_id,
    p.pos_name,
    CAST(GROUP_CONCAT(e.name,'(',e.id,')' SEPARATOR ', ') AS CHAR) AS employees
FROM
    positions p
    JOIN employees e ON e.position1 = p.pos_id OR e.position2 = p.pos_id
WHERE e.status IN (1,2)
GROUP BY p.pos_id
ORDER BY p.pos_id

次に、employeesテーブルが次のようになっている場合:

mysql> select * from employees;
+----+---------+--------+-----------+-----------+
| id | name    | status | position1 | position2 |
+----+---------+--------+-----------+-----------+
|  1 | Glen    |      1 |         1 |         5 |
|  2 | John    |      2 |         7 |         6 |
|  3 | Michael |      1 |         2 |         1 |
|  4 | David   |      0 |         3 |         4 |
|  5 | Albert  |      2 |         2 |         0 |
|  6 | Edward  |      1 |         0 |         3 |
|  7 | Ben     |      1 |         1 |         3 |
+----+---------+--------+-----------+-----------+

ポジションテーブルは次のようになりました。

mysql> select * from positions;
+--------+--------------+
| pos_id | pos_name     |
+--------+--------------+
|      1 | Janitor      |
|      2 | Guard        |
|      3 | Shift Leader |
|      4 | Driver       |
|      5 | Cook         |
|      6 | Manager      |
|      7 | Owner        |
+--------+--------------+

このクエリの結果は次のようになります。

+--------+--------------+-----------------------------+
| pos_id | pos_name     | employees                   |
+--------+--------------+-----------------------------+
|      1 | Janitor      | Michael(3), Ben(7), Glen(1) |
|      2 | Guard        | Michael(3), Albert(5)       |
|      3 | Shift Leader | Ben(7), Edward(6)           |
|      5 | Cook         | Glen(1)                     |
|      6 | Manager      | John(2)                     |
|      7 | Owner        | John(2)                     |
+--------+--------------+-----------------------------+
于 2012-07-30T22:17:55.623 に答える
0

のソースを調べると、2 番目のパラメーターなし$sql->RunSQL()で呼び出しているに違いありません。mysql_fetch_array()その関数のデフォルトの動作は、定数MYSQL_NUMまたはMYSQL_ASSOCが 2 番目のパラメーターとして渡されない限り、連想キーと数値キーの両方を返すことです。

これを、連想キーと数字キーの両方ではなく、連想キーのみを返すmysql_fetch_assoc()orの呼び出しに置き換えます。mysql_fetch_array($the_result_resource_variable, MYSQL_ASSOC)

于 2012-07-28T01:37:59.503 に答える