0

クエリを作成しようとしていますが、行き詰まっています。

コンテキスト 私の Web サイトのユーザーは、プロファイルにさまざまなフィールドを持っています。これらのフィールドの 1 つは、ニュースレターのチェックボックスです。今、私たちは2番目のニュースレターを作るつもりです。ニュースレターを購読しているすべてのユーザーは、2 番目のニュースレターを自動的に購読し、購読を解除するオプションがあります。元のニュースレターを購読していないユーザーは、2 番目のニュースレターも受け取るべきではありません。

テーブル フィールドはテーブル「Profile_field」に保存されます。このテーブルには 3 つの列があります

  • fid => フィールド ID (プロファイル名、住所、ニュースレターなど)
  • uid => ユーザーID
  • 価値

したがって、すべてのユーザーに対して、field1 の値を field2 にコピーする必要があります

これまでのクエリ

UPDATE profile_values AS copy
SET value =
   (SELECT value
    FROM ( Select Value
           FROM profile_values as original
           WHERE fid = 12
         ) AS temp
   )
WHERE fid=37
;

これでエラーが発生します:

エラー 1242 (21000): サブクエリは複数の行を返します

なぜ私がこれを持っているのか理解しています。これは、サブクエリでは、ユーザーが異なるためにフィールドが複数の結果を返すことを考慮していないためです。言い換えれば、私はユーザーを考慮していません。

だから私は次のようなものを試しました

FROM ( Select Value
           FROM profile_values as original
           WHERE fid = 12
         ) AS temp
WHERE uid=copy.uid

しかし、それもうまくいきません。

エラー 1064 (42000): SQL 構文にエラーがあります。1 行目の '"temp" WHERE uid=copy.uid )where fid=37' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

では、クエリでユーザーを考慮するにはどうすればよいでしょうか?

敬具

ステファン・セリス

4

2 に答える 2

3

更新には、次を使用します。

UPDATE profile_values pv
       JOIN (SELECT value,
                    uid
             FROM   profile_values
             WHERE  fid = 12) AS current_field_values
         ON current_field_values.uid = pv.uid
SET    pv.value = current_field_values.value
WHERE  pv.fid = 37  
于 2013-08-26T12:29:35.730 に答える
0

ニュースレターの追加を扱っている場合はinsertupdate. 次のようなもの:

insert into profile_values(uid, fid, value)
    select uid, 37, 1
    from profile_values pv
    group by uid
    having max(fid = 12 and value = 1) > 0;

つまり、既存のニュースレターを持つすべてのユーザーに対して、新しいニュースレターに新しい値を挿入します。

于 2013-08-26T12:17:08.390 に答える