要件は、識別子が次のような英数字の文字列である、最初に使用可能な識別子を見つけることです。
ABC10000
ABC10345
ABC88942
ABC90123
データベーステーブルの構造は次のとおりです。
id, user, identifier
アルファコンポーネントABC
は全体を通して一貫しており、変更されないことに注意してください。数値成分は10000から99999の間でなければなりません。
これに取り組む最善の方法は?過度に複雑な問題のようには見えません。MySQLのみ、またはSQLとPHPの組み合わせを使用した最も単純な解決策を探しています。現在のソリューションでは、各レコードをデータベースから配列にプルしてから、10000以降でループし、ABC
可用性を付加してチェックします。これは大幅に改善される可能性があるようです。
編集:元の質問は、一定量の識別子がすでに割り当てられているという点で十分に明確ではありませんでした。私はギャップを埋めようとしています。私が提供した短いリストから、次に利用できるのはABC10001です。ただし、最終的にはABC10346、次にABC88943などになります。
編集:構造が不十分な質問でごめんなさい。これ以上の混乱を避けるために、実際のテーブル構造は次のとおりです。
CREATE TABLE IF NOT EXISTS `User_Loc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` int(11) DEFAULT NULL,
`value` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_64FB41DA17323CBC` (`user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4028 ;
テーブルを自己結合し、結合されたテーブルで最初のNULL値を探す必要があります
SELECT CONCAT('ABC', SUBSTRING(t1.value, 4)+1) AS next_value
FROM test t1
LEFT JOIN test t2 on SUBSTRING(t1.value, 4)+1 = SUBSTRING(t2.value, 4)
WHERE ISNULL(t2.value)
ORDER BY t1.value ASC
LIMIT 1
http://sqlfiddle.com/#!2/d69105/22
ncatnowのいくつかの「専門分野」についてのコメント付き。なくしための副選択の助けを借りて行うため、わずかadjusmentsがあります'ABC'
し、UNION
デフォルト値を持つためには、
SELECT
CONCAT('ABC', t1.value+1) AS next_value
FROM
((SELECT '09999' AS value) UNION (SELECT SUBSTRING(value, 4) AS value FROM test)) t1
LEFT JOIN
((SELECT '09999' AS value) UNION (SELECT SUBSTRING(value, 4) AS value FROM test)) t2
ON t1.value+1 = t2.value
WHERE
ISNULL(t2.value)
AND t1.value >= '09999'
ORDER BY t1.value ASC
LIMIT 1
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加