Каждый из моих пользователей имеет определенное количество слотов для хранения. Они могут удаляться из любого слота и есть максимальное количество слотов (еще не определено, но будет где-то в диапазоне от 30 до 100). Поэтому, если пользователь имеет элемент в своих первых 5 слотах, а затем они удаляют из слотов 4 и 2. У них будут предметы, все еще находящиеся в слотах 0, 1, and 3
. Я хочу найти их первый пустой слот, поэтому в этом примере: слот 2.Как сгенерировать набор целых чисел в MySQL
Я открыл для себя способ сделать это, но он кажется хакером и может быть оптимизирован.
Это, как я в настоящее время сделать это:
// Make set of ints from 0 to max size
$slots = 'SELECT 0 as `x`';
for($i = 1; $i < $max; $i++)
$slots .= ' UNION SELECT '.$i.' as `x`';
$q = $db->prepare('
SELECT MIN(`x`)
FROM (
'.$slots.'
) as `slots`
WHERE
`x` NOT IN (
SELECT `slot`
FROM `'.$table.'`
WHERE
`user` = ?
)
');
$q->setFetchMode(PDO::FETCH_NUM);
$q->execute(array($user));
Так что если MAX = 5 запрос станет:
SELECT MIN(`x`)
FROM (
SELECT 0 as `x` UNION
SELECT 1 as `x` UNION
SELECT 2 as `x` UNION
SELECT 3 as `x` UNION
SELECT 4 as `x`
) as `slots`
WHERE
`x` NOT IN (
SELECT `slot`
FROM `my_table`
WHERE
user = 1
)
В основном я генерации подзапрос создать тэ эквивалент в PostgreSQL generate_series(0, MAX - 1) Как я уже говорил ранее, MAX будет между 30 и 100.
Некоторые другие идеи, которые я должен был сделать, это либо:
- имеет постоянную таблицу с одной колонком (
x
) и рядом для каждого целого числа между 0 и 99, а также использовать, что вместо подзапроса или - Выбрать все заполненный пользователь слоты хранения, а затем итерации через результаты (в PHP), пока не будет найден первый пустой слот.
Есть ли они лучше, или есть ли другой способ, который лучше?
Это, кажется, случай «если все, что у вас есть, это молот». Не будет ли вам легко использовать язык программирования для генерации ваших данных, а не для использования sql? –
Я должен согласиться с адрианом. Это больше похоже на «я могу назвать эту мелодию в одном запутанном запросе», а не законное решение для набора чисел, даже если конечный результат заключается в том, чтобы прокормить их в ваш db. – atxdba
Хотя друг показал мне какой-то номер MS sql, который мог бы заполнить таблицу последовательных номеров крутым трюком. –