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

私がやりたいことは、フォローアップが「YES」に設定されている最初のテーブルをクエリし、その結果からユーザーテーブルから順番にユーザーを割り当てることで、最終的な取引テーブルは次のようになります

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

ループであることは知っていますが、何らかの理由で、2 番目のループをセットアップしてユーザーの値を割り当てる方法がわかりません。どんな助けでも大歓迎です。

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

あなたが言及したことを達成するには、一連の手順に従う必要があります。

followUP1) 「はい」のデータベースからすべてのレコードを取得します。
最初のテーブルがdeals. followUPしたがって、 「はい」のすべてのレコードを取得します。
$deals_details という結果になったとしましょう。

2) データベースからすべてのユーザー (名前) を取得します。
2 番目のテーブルが であるとしましょうusers。したがって、すべてのユーザーをフェッチします。
$users_details 配列にすべてのユーザーの名前があるとします。
$users_countなどの別の変数で、システム内の合計ユーザー数を取得します。

3) $deals_details をループし、$users_details から順に各ユーザーを 1 人ずつ割り当てます。

$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 | OSの問題 | 7 | | | 2 | USB の問題 | 8 | | | 3 | OS の改ざん | 7 | | | 4 | HD の問題 | 9 | | | 5 | DVD発行 | 6 | | | 6 | SWの問題 | 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も割り当て_作業テーブルに保存する必要があり、同時にユーザー_idも順次保存する必要があり
ます。その個人IDのみのチームであるユーザーテーブルから取得します。私はphが初めてです。誰か助けてください。

于 2013-02-07T06:07:49.557 に答える
0

これは、設計上の決定として不適切な場合があります。あなたのアプリケーションについてもっと知ることなく、私はユーザーが利用可能になるのを待って/取引を要求し、そしてフォローアップを必要とする次の取引を(キューから)彼らに割り当てたいと思うでしょう。ユーザーが「利用可能」になる前にユーザーを割り当てる正当な理由がある場合でも、適切なビジネスロジックに基づいて取引の作成/変更時に行うことを検討できます(たとえば、次の取引に割り当てられるユーザーのキューを維持する)。

確かに、単純なUPDATEステートメントでこの操作を実行する特に優れた方法はありません。純粋にデータベース内でそれを実現する1つの方法は、ストアドプロシージャを使用することです(ただし、カーソルUsersを閉じてから再度開くまでの間にテーブルを変更すると、望ましくない影響が生じる可能性があるため、特に同時実行性は安全ではありません。代わりに、を一時テーブルにコピーする場合があります。この手順の目的のために、必要なロジックに応じて):_curUserUsers

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 に答える