【问题标题】:PHP Process MySQL reponse Array into Array of unique recordsPHP将MySQL响应数组转换为唯一记录数组
【发布时间】:2012-07-28 01:27:21
【问题描述】:

在 PHP 中,我运行此查询并获得 array,其中有 2 条记录,每条记录有 2 个键 现在从这个array 我需要提取唯一记录 有没有比我在下面做的更专业的方法来构建这个查询然后从数组中提取唯一记录?

P.S. position1positions2 表是相同的。所以position1可以删除其中一个。

$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=Driverposition2=Driver、 员工山姆有Poition1=DriverPosition2=Guard 员工迈克有Position1=CookPosition2=Driver 所以在这种情况下我需要选择

列表:

4,  Driver
19, Guard
2,  Cook

【问题讨论】:

  • 那么,您得到的是任何具有 1 或 2 状态的员工所担任的所有职位?如果同一员工担任 2 个职位,那么您希望他们都出现在您的结果中。您的服务器端逻辑向我暗示您可能可以在 SQL 中做同样的减少。在您的 PS 中,您是说 position1 和 position2 是相同的吗?它们是否拥有相同的数据或只是相同的结构?另外,您使用的 DBO 是什么。我不熟悉具有 RunSQL 方法的方法。
  • 您所说的 DBO 是指存储引擎吗?我使用默认的 MyISAM。是的,两个表位置1 和位置1 以及它们中的数据相同。我需要获取分配给员工 position1 和 position2 的所有职位的唯一职位列表(pos_id、pos_name)(对于状态为 1 和 2 的员工)。
  • 我想知道您正在使用的数据库对象或库的名称是什么。常见的有 PDO、mysqli_、MDB2 等,但我对 RunSQL 方法不熟悉。
  • 好的,我使用 mysql 库(不是 PDO 或 MySQLi)并且 RunSQL() 只是我创建的函数的名称 - 它使用 mysql_query() 访问数据库;

标签: php mysql


【解决方案1】:

查看$sql-&gt;RunSQL() 的源代码,我敢打赌它在没有第二个参数的情况下调用mysql_fetch_array()。该函数的默认行为是返回关联键和数字键,除非常量 MYSQL_NUMMYSQL_ASSOC 作为第二个参数传递。

将其替换为调用 mysql_fetch_assoc()mysql_fetch_array($the_result_resource_variable, MYSQL_ASSOC) 以仅返回关联键而不是关联键和数字键。

【讨论】:

  • 我没有看到关联数组和数值数组如何解决我的问题,默认情况下我得到了上面打印的多维数组。
【解决方案2】:

假设位置 1 和位置 2 是一个位置表的副本,我会将查询更改为如下所示:

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

如果员工表如下所示:

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)                     |
+--------+--------------+-----------------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多