私はこのようなテーブルがあります:私は質問の受け入れ答えを設定する前にこの条件を実装しようとしているUPDATE文でJOINを使用するにはどうすればよいですか?
// QandA
+----+----------------------------------------+---------+----------+-----------+
| Id | body | related | accepted | author_id |
+----+----------------------------------------+---------+----------+-----------+
| 1 | content of question1 | null | null | 12345 |
| 2 | content of first answer for question1 | 1 | 0 | 53456 |
| 3 | content of question2 | null | null | 43634 |
| 4 | content of second answer for question1 | 1 | 0 | 43665 |
| 5 | content of first answer for question2 | 3 | 1 | 43324 |
+----+----------------------------------------+---------+----------+-----------+
/* related column: Actually that's just for answers and this column is containing the id of
its question. (questions always are null) */
/* accepted column: Actually that's just for answers and specifics accepted answer.
0 means it isn't accepted answer, 1 means it is accepted answer.
(questions always are null) */
を:
条件:は、現在のユーザーかどうかを検証OPかどうか。 author_id of
その質問は$_SESSION['id']
と同じである必要があります。ここで
は私のクエリです:(私が持っているすべてのデータが受け入れ答え:answer_id
だけのIDです)
UPDATE QandA q CROSS JOIN (SELECT related FROM QandA WHERE id = :answer_id) x
SET accepted = (id = :answer_id) -- this acts like a if statement
WHERE q.related = x.related
AND
-- validating OP
(SELECT 1 FROM QandA
WHERE id = x.related AND
author_id = $_SESSION['id']
)
#1093 - あなたは "ターゲット表を指定することはできませんFROM句での更新のためのtbname '
どうすれば修正できますか?
EDIT:は実際には1つの以上の条件があります:
+----+----------------------------------------+---------+----------+-----------+------+
| Id | body | related | accepted | author_id | free |
+----+----------------------------------------+---------+----------+-----------+------+
| 1 | content of question1 | null | null | 12345 | null |
| 2 | content of first answer for question1 | 1 | 0 | 53456 | null |
| 3 | content of question2 | null | null | 43634 | 300 |
| 4 | content of second answer for question1 | 1 | 0 | 43665 | null |
| 5 | content of first answer for question2 | 3 | 1 | 43324 | null |
+----+----------------------------------------+---------+----------+-----------+------+
/* free column: Actually that's just for questions. `null` means it is a free question
and any number else means it isn't. (answers always are `null`) */
追加条件:質問がフリーであれば、OPはそれのための答えを受け入れて、そして彼の受け入れ答えを変更することができます彼の受け入れられた答えを元に戻す。しかし、質問が無料でない場合、OPは一度質問を受け付けることができ、取り消すことはできず、受け入れられた回答を変更することはできません。ここではMySQLの中で、その条件を実施している:
(SELECT 1 FROM QandA
WHERE id = x.related AND
(
(free IS NOT NULL AND
NOT IN (SELECT 1 FROM QandA
WHERE related = x.related AND
accepted = 1)
) OR free IS NULL
)
)
なぜあなたは、データベースにこのビジネスロジックのすべてを実装しようとしていますか?トランザクションを使用してアプリケーション内で実装する方がよい。 – eggyal
@eggyalこれらの2つの検証はデータベースに依存しています。私は* 1を確認する必要があります。答えを受け入れる現在のユーザーはOP *ですか? * 2。質問が無料でない場合、OPは一度だけ回答を受け入れることができます(受け入れられた回答を取り消したり変更したりすることはできません)* – Shafizadeh
だから?アプリケーションにチェックインするデータを選択し、必要なロジックを実行します。 – eggyal