私はMySQLを初めて使っていて、いくつかのエラーでぶつかっていますが、これを除いて解決策を見つけることはできません。 。MySQLのプロシージャが間違った値を返す(INSERT SELECTが向いている)
変数 "ue"が1または0(複数のバリデーションが存在する)の場合、次のMySQLプロシージャは値を返します。検証部分(SET ue = EXISTS ...)は、残りのコードなしで動作します。問題はありません。しかし、INSERT INTO SELECTコマンドを実行すると、動作しません。応答が1のときは、常に0が返されます。これらの2つの行は、互いに対立しています。
INSERT INTO meetup_participation SELECT user_id、event_id FRU DUAL WHERE ue = 1;
SELECT ue AS応答;
手順はmeetup_participationに「ユーザID」と「イベントID」を追加し、「イベントが参加」インクリメントするその「ユーザID」と「ユーザの対応するユーザに対してで行を更新すべきです。また、この 'イベントID'を使用してイベントの参加を増やすように更新します。
私は、ユーザーが存在する場合、イベントが存在する場合、イベントの日付が有効な場合、およびユーザーがこのテーブルにまだ存在しない場合のようなものを検証するためにSET ueを使用しています。ですから、私はこの値をINSERT INTO meetup_participation [...] WHERE ue = 1にブール値として渡しています。その後、SELECT ueを実行して検証がtrueを返し、プロシージャが問題なく実行されたことを通知します。
以下は完全な手順です。
CREATE DEFINER=`user`@`localhost` PROCEDURE `join_event`(IN `user_id` BIGINT(64), IN `event_id` INT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER
begin
DECLARE ue INT;
SET ue = EXISTS(SELECT 1 FROM users WHERE fb_uid=user_id) AND EXISTS(SELECT 1 FROM meetup WHERE meet_id=event_id) AND EXISTS(SELECT 1 FROM meetup WHERE date > NOW() AND meet_id = event_id) AND EXISTS(SELECT 1 FROM meetup WHERE meet_id = event_id AND participants <= max_participants) AND NOT EXISTS(SELECT 1 FROM meetup_participation WHERE fb_uid = user_id AND meet_id = event_id);
INSERT INTO meetup_participation SELECT user_id, event_id FROM DUAL WHERE ue=1;
UPDATE users SET events_participated = events_participated + 1 WHERE fb_uid=user_id AND ue=1;
UPDATE meetup SET participants = participants + 1 WHERE meet_id=event_id AND ue=1;
SELECT ue AS response;
end
ありがとうございます。
データベーステーブルから来ているフィールドとプロシージャに渡されるパラメータは、コードセグメントから分かりにくいです。これは、変数宣言でcreate procedure文を提供し、dbから来る列名の別名を付けることができれば役に立ちます。手順が長すぎない場合は、完全な手順を含めるように質問を編集します。また、私はこの2つの行が直面していることを意味していません、あなたが意味するものを記述する別の方法を見つけることができますか? –
@ P.Salmon私は、「INSERT INTO SELECT」がなければ、理解を深めるためのコードを編集しました。それは、正しい値を返します。対峙は、英語で言う正しい方法ではないかもしれません。 –
プロシージャーは機能します。SET events_participated = events_participated + 1およびSET参加者=参加者+ 1は、開始値nullを受け入れる必要があります。SET events_participated = ifnull(events_participated、0)+ 1 SET参加者= ifnull(参加者、0)+ 1 –