цикл по числовому диапазону для идентификатора вторичной записи - PullRequest
0 голосов
/ 14 ноября 2011

Итак, я думаю, что мог бы придумать какое-то дурацкое решение, но я думаю, что я мог бы также спросить заранее.

каждый пользователь может иметь много заказов.
у каждого стола может быть много заказов.
В каждом заказе может быть не более 3 предметов.

пытается настроить вещи так, чтобы пользователь мог создать заказ, и заказ автоматически генерирует ссылочный номер, и у каждого элемента есть ссылочная буква. номер ссылки 0-99 и возвращается к 0, как только он достигает 99, поэтому заказы в течение дня легко ссылаться на столы.

Итак, пользователь размещает заказ на стол № 2 из 3 предметов:
78А: красный степлер
78B: карандаши
78C: лапка кенгуру

не уверен, будет ли это сделано в логике программы или как-то на уровне SQL.

думал что-то вроде neworder = order.last + 1 и каким-то образом связывал это с диапазоном при создании заказа. довольно нечетко по конкретике.

1 Ответ

0 голосов
/ 14 ноября 2011

Не зная ответа на мой комментарий выше, я предполагаю, что вы хотите сохранить полный аудит, а не стирать исторические записи;таким образом, заказы типа 78A 78B 78C являются просто форматом отображения.

Если у вас есть одна таблица Order (содержащая ваш OrderId, UserId, DeskId, времена и любые другие вещи верхнего уровня) и таблица OrderItem (содержащий ваш OrderItemId, OrderId, LineItemId - показывает 1,2 или 3 для вашей первой и необязательной второй и третьей позиций в заказе и ProductId) и таблицу Product (ProductId, Name, Description)

затемэто довольно просто (к счастью) с помощью оператора по модулю, который дает остаток от деления, что позволяет вам в этом случае считать в группах 3 и 100 (или любое другое число, которое вы пожелаете).Просто сделайте что-то вроде следующего: (вы захотите объединить элементы в один столбец, я просто выделил их отдельно, чтобы вы могли видеть, как они работают) Очевидно, присоедините / запросите / отфильтруйте таблицы пользователей, рабочих столов и таблиц продуктов соответствующим образом.

select
o.OrderId,
o.UserId,
o.DeskId
o.OrderId%100 + 1 as OrderNumber, 
case when LineItem%3 = 1 then 'A'
 when LineItem%3 = 2 then 'B'
 when LineItem%3 = 0 then 'C'
end as ItemLetter,
oi.ProductId
from tb_Order o inner join tb_OrderItem oi on o.OrderId=oi.OrderId

В качестве альтернативы, вы можете добавить itemLetter (A, B, C) и / или OrderNumber (1-100) как вычисленные (и сохраненные) столбцы в самих таблицах, чтобы они вычислялисьодин раз при вставке, а не при пересчете / форматировании, когда они выбраны.Этот вид ломает некоторые лучшие практики, когда вы сохраняете необработанные данные в БД и форматируете их при извлечении;но если вы не собираетесь обновлять данные и собираетесь выбирать данные больше, чем вы собираетесь записывать данные;тогда я нарушу это правило и вычислю ваше форматирование во время вставки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...