わかりました、これは初めての試みCREATE FUNCTION
ですので、ご容赦ください。
だから、私はこの(簡略化された)テーブル構造を持っています:
CREATE TABLE `pokemon` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`userid` INT UNSIGNED NOT NULL,
`boxid` TINYINT UNSIGNED NOT NULL DEFAULT 255,
`boxpos` SMALLINT UNSIGNED,
PRIMARY KEY (`id`),
UNIQUE KEY `position` (`userid`,`boxid`,`boxpos`)
) ENGINE=InnoDB
ユーザー ID とボックス ID を指定すると、空のボックス位置 (つまり、重複キー エラーをトリガーしないもの) を返す関数を作成したいと考えています。
boxid
ボックス ID には 0 ~ 249 の値を使用し、ユーザーのパーティには特別な値として 255 を使用することに注意してください。boxpos
ボックスでは 0 ~ 45,504 の範囲で指定できますが、パーティーでは 0 ~ 5 のみです。また、パーティーでは返される位置は最初の空の位置である必要がありますが、ボックスではランダムな位置である必要があります。
したがって、これらすべてを念頭に置いて、ここに私の試みがありました:
begin
declare ret smallint unsigned;
declare exist tinyint unsigned default 1;
if fieldid = 255 then
create temporary table `party` (
`pos` smallint unsigned not null
);
insert into `party` values (0),(1),(2),(3),(4),(5);
delete from `party` where `pos` in (select `fieldpos` from `pokemon` where `userid`=userid and `fieldid`=255);
select `pos` into ret from `party` limit 1;
if ret is null then select `[[Error: No room in Party]]` from `party`; end if;
else
while exist=1 do
set exist=0;
set ret=floor(rand()*45504);
select 1 into exist from `pokemon` where `fieldid`=fieldid and `userid`=userid and `fieldpos`=ret;
end while;
end if;
return ret;
end;
(これは phpMyAdmin に入力された関数の本体であることに注意してください)
編集:問題を修正しましたDECLARE
が、関数から結果セットを返すことができないと言っています。
どこで間違ったのかわかりません。正しい軌道に乗るには助けが必要だと思います。特に、そもそも関数のロジックを正しく理解できているでしょうか?