###前提・実現したいこと:SQLであるテーブルを、他のテーブルのデータで更新したい
SQLで、以下のようなテーブルのフィールドを、他のテーブルのフィールドのデータで更新したいのですが、エラーが出ており、行き詰っております。
初心者であります故、質問に至らぬ点があるかもしれませんがどうぞよろしくお願いいたします。
###発生している問題・エラーメッセージ
#1242 - Subquery returns more than 1 row
###更新の要領
■更新したいテーブル名:field_data_field_birthday_after _____________________________________________ | entity_id | type | value | ============================================= | 1 | profile-a | 1984-06-12 06:15:45 | | 4 | profile-a | 1985-06-12 06:15:45 | | 7 | profile-a | 1986-06-12 06:15:45 | --------------------------------------------- ■更新の手順 ※文字情報だけだとややこしいので、イメージ図も下に掲載しておきます。 併せてご参照いただけると幸いです。 ①上記「field_data_field_birthday_after」の"entity_id(PRIMARY)"と、 下記テーブル「profile」の"pid(PRIMARY)"とを紐づけます (entity_id:pid=1:1)。 _______________________ | pid | uid | bundle | ======================= | 1 | 1 | profile-a | | 2 | 1 | profile-b | | 3 | 1 | profile-c | | 4 | 2 | profile-a | | 5 | 2 | profile-b | | 6 | 2 | profile-c | | 7 | 3 | profile-a | | 8 | 3 | profile-b | | 9 | 3 | profile-c | ----------------------- ②「profile」内の、①で紐づけられた各レコードと同じuidを持ち、 かつ"bundle"が"profile-c"のレコードを下記のように抽出ます。 _______________________ | pid | uid | bundle | ======================= | 3 | 1 | profile-c | | 6 | 2 | profile-c | | 9 | 3 | profile-c | ----------------------- ③抽出されたレコードの"pid"を、 「field_data_field_birthday_after」の"uid"が同じレコードの"entity_id"に上書きします。これで更新完了です。 ※2016/11/1追記 テーブルの詳細情報について、ご指摘いただきましたので、下記追記させていただきます。 [profileテーブル] ・一つのuidに対してある"profile-■"は一つだけです。 ですので、 (pid, uid, bundle)=(9, 3, profile-c)が存在する一方で、(10, 3, profile-c) が存在するということはありません。 [field_data_field_birthday_after] ・"type"に格納される「profile-■」は「profile-a」のみとなります。また、更新前の"entity_id"と"type"とに格納されているデータの組み合わせは「profileテーブル」の"bundle"と"uid"のデータの組み合わせと一致します。そのため、例えば、field_data_field_birthday_afterテーブルに(2, profile-a, 1984-11-01 00:00:00) というデータが入ることはありません。
###試したこと
下記のSQLでテーブルをUPDATEしようとしました。
UPDATE field_data_field_birthday_after SET field_data_field_birthday_after.entity_id = (SELECT pid FROM profile JOIN ( SELECT uid FROM profile JOIN (SELECT entity_id AS temp_id FROM field_data_field_birthday_after) AS temp ON profile.pid = temp_id ) AS user ON profile.uid = user.uid WHERE TYPE = 'profile-c');
すると上記にもある「#1242 - Subquery returns more than 1 row」というエラーが返ってきました。
調べたところ、「このエラーは、サブクエリーが最大で 1 行しか返す必要がないにもかかわらず、複数の行を返すステートメントで発生します。」とのことです
(https://dev.mysql.com/doc/refman/5.6/ja/subquery-errors.html)。
ただし、そもそも、私が更新しようとしている行は複数あるため、更新する内容も当然複数あります。
にもかかわらず、何故これがエラーになるのでしょうか?
どなたかご存知であればご教示いただきたく思います。
よろしくお願いいたします。
###MySQL情報
MySQLバージョン 5.0.95
回答3件
あなたの回答
tips
プレビュー