2

我有一个包含以下数据的交易表:

dealID   |   date    |   followUP  |  user
1        |2012-10-15 |    Yes      |
2        |2012-12-24 |    Yes      |
3        |2013-01-05 |             |
4        |2013-02-02 |    Yes      |
5        |2013-02-02 |    Yes      |

还有一个包含我的用户列表的用户表

userID    | name
1         | john
2         | eric
3         | anne

我想做的是查询第一个将 followUP 设置为“YES”的表,然后从结果中从 users 表中按顺序为他们分配一个用户,这样我的最终交易表将如下所示

dealID   |   date    |   followUP  | userID
1        |2012-10-15 |    Yes      | 1
2        |2012-12-24 |    Yes      | 2
3        |2013-01-05 |             |
4        |2013-02-02 |    Yes      | 3
5        |2013-02-02 |    Yes      | 1

我知道它是一个循环,但由于某种原因,我无法弄清楚如何设置第二个循环来分配用户的价值。任何帮助,将不胜感激。

4

4 回答 4

2

首先将您的用户 ID 放入一个数组中,使其看起来:

$uids = array(1, 2, 3);

然后,当从交易表中读取记录时,会像这样编写更新查询:

$follow_up_user_idx = 0;
$update_queries = array();
while($row=mysqli_fetch_assoc($result)) {
    // ... do whatever you need to
    if($row['followUP'] != 'Yes') continue;
    $update_queries[] = "UPDATE `deals` SET `user` = '" . $uids[$follow_up_user_idx] . "'
                         WHERE `dealID` = '" . $row['dealID'] . "' LIMIT 1";
    $follow_up_user_idx++;
    if($follow_up_user_idx > count($uids) - 1) $follow_up_user_idx = 0;
}

现在您有了所有更新查询。只需执行它们:

foreach($update_queries as $uq) {
    mysqli_query($link, $uq);
}
于 2013-01-16T05:01:44.060 回答
1

您将必须遵循一系列步骤来实现您所提到的。

1)从数据库中获取followUP“是”的所有记录。
可以说第一张桌子是deals. followUP因此,获取“是”的所有记录。
可以说,您有 $deals_details 的结果。

2)从数据库中获取所有用户(名称)。
可以说第二张桌子是users. 因此,获取所有用户。
可以说,您在 $users_details 数组中拥有所有用户的姓名。
在单独的变量 $users_count 中获取系统中的总用户数。

3) 循环遍历$deals_details,从$users_details依次为每个用户分配。

$i = 0;
foreach($deals_details as $keyDD => $valueDD){
    $user = $users_details[$i];
    $i++;
    if($i == $users_count)
        $i = 0;
    $query = "update `deals` set user = '".$user."' where dealID = '".$valueDD['dealID']."'";

    //fire query
    //$link is connection variable.
    mysqli_query($link, $query);
}
于 2013-01-16T05:04:28.227 回答
1

表用户 +---------------+----------------+------------+ | 用户 ID | 用户名 | 用户级别 | +---------------+---------------+------------+ | 1 | 超级管理员 | 管理员 | | 2 | 副管理员 | 管理员 | | 3 | 团队1 | 团队 | | 4 | 团队2 | 团队 | | 5 | 团队3 | 团队 | | 6 | 客户1 | 客户 | | 7 | 客户2 | 客户 | | 8 | 客户3 | 客户 | | 9 | 客户4 | 客户 | +---------------+---------------+------------+ 餐桌投诉:+---------------+---------------+------------+ | 投诉ID | 投诉 | 用户 ID | +---------------+---------------+------------+ | 1 | 操作系统问题 | 7 | | 2 | USB 问题 | 8 | | 3 | 操作系统currepted | 7 | | 4 | 高清问题 | 9 | | 5 | DVD发行| 6 | | 6 | 软件问题 | 9 | | 7 | 网络问题| 9 | | 8 | 系统问题 | 6 | +---------------+---------------+------------+表assign_work +- --------------+------------+ | 投诉ID | 用户 ID | +---------------+------------+ | 1 | 3 | | 2 | 4 | | 3 | 5 | | 4 | 3 | | 5 | 4 | | 6 | 5 | | 7 | 3 | | 8 | 4 | +---------------+------------+

当客户提出投诉时,投诉数据也应该保存在投诉表中,最后一个投诉_id应该保存在assign_work表中,同时
user_id也顺序保存,从用户表中获取只有该人ID的团队。我是ph新手,请任何人帮助我。

于 2013-02-07T06:07:49.557 回答
0

这可能是一个糟糕的设计决策。在不了解您的应用程序的更多信息的情况下,我很想等待用户可用/请求交易,然后(从队列中)为他们分配需要跟进的下一个交易。即使您有充分的理由在用户“可用”之前分配用户,您也可能会考虑在基于某些适当业务逻辑的交易创建/修改时这样做(例如,维护要分配给下一个交易的用户队列)。

确实,没有特别好的方法可以通过简单的UPDATE语句来执行此操作。Users纯粹在数据库中完成它的一种方法是使用存储过程(尽管它不是特别安全的并发,因为在关闭和重新打开游标之间更改表_curUser可能会导致不良影响;可以改为将其复制Users到临时表出于此过程的目的,取决于您所需的逻辑):

DELIMITER //

CREATE PROCEDURE assignDeals() BEGIN
  DECLARE _userID, _dealID BIGINT UNSIGNED;
  DECLARE _done BOOLEAN DEFAULT FALSE;

  DECLARE _curUser CURSOR FOR
    SELECT   userID
    FROM     users
    ORDER BY userID;

  DECLARE _curDeal CURSOR FOR
    SELECT   dealID
    FROM     deals
    WHERE    followUP = 'Yes'
    ORDER BY dealID
    FOR UPDATE;

  DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET _done := TRUE;

  PREPARE stmt FROM 'UPDATE deals SET userID = ? WHERE dealID = ?';

  OPEN _curUser;
  OPEN _curDeal;

  readDeal: LOOP
    FETCH _curDeal INTO _dealID;
    IF _done THEN
      LEAVE readDeal;
    END IF;

    FETCH _curUser INTO _userID;
    IF _done THEN
      SET _done := FALSE;
      CLOSE _curUser;
      OPEN  _curUser;
      FETCH _curUser INTO _userID;
      IF _done THEN
        SIGNAL SQLSTATE VALUE '45000' SET
          MESSAGE_TEXT = 'No users';
        LEAVE readDeal;
      END IF;
    END IF;

    SET @userID := _userID, @dealID := _dealID;
    EXECUTE stmt USING @userID, @dealID;
  END LOOP readDeal;

  CLOSE _curUser;
  CLOSE _curDeal;

  DEALLOCATE PREPARE stmt;
END//

DELIMITER ;

sqlfiddle上查看。

于 2013-01-16T05:29:17.200 回答