PHP7以降から E_STRICT 通知が廃止されました。それに伴い今まで E_STRICT だったものは
E_NOTICEE_WARNINGE_DEPRECATED のいずれかに変更になります。E_ALL & ~E_STRICT でひとまず非表示にしておく、ということができなくなったのでその場合対応が必要です。
いくつかある変更対象のエラーのなかで、比較的うっかりやりがちな Signature mismatch during inheritance と Only variables should be passed by reference について取り上げます。
<?php// 関数の戻り値を直接渡しては×var_dump(array_pop(explode(',', '1,2,3,4')));
//=> Notice: Only variables should be passed by reference in ...// 一度変数に格納すればok$hoge=explode(',', '1,2,3,4');
var_dump(array_pop($hoge));
//=> string(1) "4"
E_NOTICE になるケース
数字で始まり、数値以外で終わる文字列のときに発生 Notice: A non well formed numeric value encountered in ...
E_WARNING になるケース
数値が含まれない文字列のときに発生 Warning: A non-numeric value encountered in ...
<?phpvar_dump("0" +1);
//=> int(1)var_dump("01" +1);
//=> int(2)var_dump("" +1);
//=> Warning: A non-numeric value encountered in ...var_dump("1m" +1);
//=> Notice: A non well formed numeric value encountered in ...var_dump("m1" +1);
//=> Warning: A non-numeric value encountered in ...var_dump("1m" + "");
//=> Notice: A non well formed numeric value encountered in ... //=> Warning: A non-numeric value encountered in ...
Vue CLIを使って新しいプロジェクトを作ります。このとき、 features の選択肢で Router を追加しておきましょう(SPAのページ遷移もほしいので)。
$ vue create frontend
Vue CLI v3.4.0
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, Router, Linter
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a linter / formatter config: Basic
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? In dedicated config files
SELECT id, t.name, @n:=@n+1AS no, t.class
FROM ShipsTemp t
INNER JOIN (
SELECT @n:=max(no), class
FROM Ships
GROUPBY class
) m ON m.class = t.class
ORDERBY t.class, id;
結果
id
name
no
class
2001
大和
4
戦艦
2005
武蔵
5
戦艦
2002
飛竜
6
航空母艦
2006
蒼龍
7
航空母艦
2009
加賀
8
航空母艦
2011
大鳳
9
航空母艦
2004
鈴谷
10
軽巡洋艦
2008
熊野
11
軽巡洋艦
2003
足柄
12
重巡洋艦
2007
妙高
13
重巡洋艦
2010
那智
14
重巡洋艦
どうやら最初に3はセットされるけどその後はただインクリメントされるようです。
グループ別最大値を取得してカウンターの値を足す
最大値とカウンターを分ければいいんじゃね?
SELECT id, t.name, max_no+@n AS no, t.class, @n:=@n+1FROM ShipsTemp t
INNER JOIN (
SELECT max(no) AS max_no, class
FROM Ships
GROUPBY class
) m ON m.class = t.class,
(SELECT @n:=1) n
ORDERBY t.class, id;
SELECT
id,
t.name,
@c AS old_class,
CASE WHEN @c<>t.class THEN @n:=1ELSE @n:=@n+1ENDAS counter,
max_no+@n AS new_no,
@c:=t.class AS new_class
FROM ShipsTemp t
INNER JOIN (
SELECT max(no) AS max_no, class
FROM Ships
GROUPBY class
) m ON m.class = t.class,
(SELECT @n:=1, @c:='') c
ORDERBY t.class, id;
結果
id
name
old_class
counter
new_no
new_class
2001
大和
1
5
戦艦
2005
武蔵
戦艦
2
6
戦艦
2002
飛竜
戦艦
1
2
航空母艦
2006
蒼龍
航空母艦
2
3
航空母艦
2009
加賀
航空母艦
3
4
航空母艦
2011
大鳳
航空母艦
4
5
航空母艦
2004
鈴谷
航空母艦
1
3
軽巡洋艦
2008
熊野
軽巡洋艦
2
4
軽巡洋艦
2003
足柄
軽巡洋艦
1
4
重巡洋艦
2007
妙高
重巡洋艦
2
5
重巡洋艦
2010
那智
重巡洋艦
3
6
重巡洋艦
いい具合にclassが変わったところでカウンターがリセットされました。
安全のために並び替え
でもこれ ORDER BY が効いてグループ順に処理してるっていう確証がないと破綻しちゃうよね。 SELECTはORDER BYより先に評価されるって言うから、今回たまたまうまく行っただけで場合によってはグループ順に並ばないかもしれません。
ならば、先に並び替えたテーブルを結合すれば確実にグループ順に処理されるでしょう。
SELECT
t2.id,
t2.name,
@c AS old_class,
CASE WHEN @c<>t2.class THEN @n:=1ELSE @n:=@n+1ENDAS counter,
max_no+@n AS new_no,
@c:=t2.class AS new_class
FROM
(SELECT * FROM ShipsTemp ORDERBY class, id) t2
INNER JOIN (
SELECT id, max_no
FROM ShipsTemp t
INNER JOIN (
SELECT max(no) AS max_no, class
FROM Ships GROUPBY class
) m ON m.class = t.class
ORDERBY t.class, id
) m2 ON m2.id=t2.id,
(SELECT @n:=1, @c:='') c
ORDERBY class, t2.id;