1

user_id (user_id = 5 としましょう) を検索する SQL クエリを作成するのに助けが必要ですが、この user_id には複数の行エントリがありますが、各行を別々に更新する必要があります。

そのuser_idに割り当てたいデータの配列があります。以下にテーブルの例を示します。

id    user_id    amount    txn_id
1     5          10        foo_unique
2     5          5         bar_unique
3     7          15        xyz_unique
4     5          10        123_unique

私の配列は次のようになります。

Array (
    [0] => 14
    [1] => 6
    [2] => 9
)

ご覧のとおり、user_id 5 に対して 3 つの配列値と 3 つの行があるので、その配列の各値を対応する user_id (5) に追加します。UNIQUE という名前の列があることに注意してくださいtxn_id

テーブルを更新すると、次のようになります。

id    user_id    amount    txn_id
1     5          14        foo_unique
2     5          5         bar_unique
3     7          6         xyz_unique
4     5          9         123_unique

これを達成する方法はありますか?

ありがとう。

PS: この問題では SQL CASE を使用できません。

4

4 に答える 4

2

1 つの行を値で更新する場合は、その行に対して一意の条件を設定できる必要があります。

行を一意に識別するためのフィールドや条件を追加しないと、うまくいきません。

于 2012-09-25T19:29:20.170 に答える
0

問題を見ると、SQL ステートメントのみが必要です。

まず、2 つのテーブルを作成します。

CREATE TABLE users 
  user_id int(11) PRIMARY KEY NOT NULL,
  username varchar(25),
) Engine = InnoDB;

CREATE table userbalances (
  balance_id int(11) PRIMARY KEY NOT NULL,
  user_id int(11),
  amount decimal(10,2),
  CONSTRAINT userid_fk FOREIGN KEY userid_fk(user_id) REFERENCES users(userid)
) Engine = InnoDB;

次に、テーブル内のすべてのユーザーとユーザー残高をINSERT(ed) した後、UPDATE ステートメントを作成して金額を更新するだけです。

UPDATE userbalances SET amount=? WHERE user_id=? AND balanceid=?

更新はループする必要があります。そして、mysql_query()関数を使用して、割り当てられた配列で更新する必要があります。

注: userbalancesテーブル内に複数のトランザクションがあるため、 useridbalanceidの 両方を UPDATE ステートメントの WHERE 句に含める必要があります。そうしないと、そのユーザーのすべてのトランザクションのすべての残高が変更されます。

問題の更新: この問題で SQL Cases を使用しない場合、問題は単なる PHP です。金額を更新するには、UPDATE(ing) の機能が何であるかを調べる必要があります。テーブルがすべて事前設定されている限り。使用するプログラムには、更新に使用する機能がある場合があります。

于 2012-09-25T20:14:04.590 に答える
0

次のクエリを使用できます。

UPDATE MyTable
SET
    amount = 
        CASE id 
            WHEN 1 THEN 14
            WHEN 2 THEN 6
            WHEN 3 THEN 9
            ELSE amount -- just in case user_id 5 has records not covered above.
        END
WHERE 
    user_id = 5
于 2012-09-25T19:26:33.133 に答える
0

問題は、どの配列エントリがどのデータベース行に属しているかを示すものが配列にないことです。id(配列インデックスとデータベースの)順序のみに依存する場合は、SELECT最初にユーザーのすべての行を取得してから、一度に行をループして更新する必要があります。PHP(およびPDO)で次のようなもの:

$values = array(14, 6, 9);
$dbh = new PDO('mysql:host=localhost;dbname=yourdbname', 'username', 'password');
$selectQuery = 'SELECT id FROM yourtable WHERE user_id = 5 ORDER BY id';
foreach($dbh->query($selectQuery) as $row) {
    $id = $row['id'];
    $sth = $dbh->prepare("UPDATE yourtable SET amount = :val WHERE id = :id");
    $sth->execute(array(
        'val' => array_unshift($values),
        'id' => $id
    ));
}

(上記のコードは、配列の値の数が のデータベース行の数と一致することを前提としていますuser_id = 5)。

于 2012-09-25T19:47:27.573 に答える