2013-06-17 2 views
2

Надеюсь, что название этой темы имеет смысл.Как показать только одну запись - запись с наименьшим значением?

Пожалуйста, взгляните на скриншот ниже.

enter image description here

Верхняя половина показывает дб с двумя пользователями, которые зарегистрировались для обучения.

По умолчанию, есть емкость 45 место

  • После USERB подпишется, есть 44 слева.

  • Затем пользовательA подписывается, теперь имеется 43 места.

Пока все хорошо.

Но, пожалуйста, взгляните на нижнюю половину этого снимка экрана. Обратите внимание, что на экране отображается 43 места, а также 44 места. Это очень смущает наших пользователей. Как мы можем просто показать наименее доступный номер? Другими словами, после каждой регистрации отобразите только номер, представляющий оставшееся место. В приведенном выше примере это будет 43.

В следующий раз, когда другой пользователь подписывается, число уменьшается на 1 и становится 42, и это номер, который мы хотели бы показать в том месте, где пользователь зарегистрировался для этого класса и на дату проведения занятий.

Ниже приведен код, который я использую.

Как я могу настроить его, чтобы показать только самое текущее число, которое является наименьшим из числа доступныхSeats?

<asp:SqlDataSource ID="sqlDataSourceloc" runat="server" 
    ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" 
    SelectCommand="SELECT locationId, Location FROM tblLocations order by location asc"></asp:SqlDataSource> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" 
SelectCommand="select DISTINCT l.LocationId,c.courseId, c.coursename, (case when isnull(t.availableSeats,30) = 0 then 'Class is full' 
       else str(isnull(t.availableSeats,30)) end) availableSeats,d.dateid,d.trainingDates, d.trainingtime, c.CourseDescription,i.instructorName, l.location,l.seating_capacity 
       from tblLocations l 
       Inner Join tblCourses c on l.locationId = c.locationId 
       left join tblTrainings t on l.locationId = t.LocationId and c.courseId = t.courseId 
       Inner Join tblTrainingDates d on c.dateid=d.dateid 
       Inner Join tblCourseInstructor ic on c.courseId = ic.CourseId 
       Inner Join tblInstructors i on ic.instructorId = i.instructorId" 
     FilterExpression="LocationId = '{0}'" > 
<FilterParameters> 
<asp:ControlParameter ControlID="ddlLocation" Name="LocationId" 
    PropertyName="SelectedValue" Type="Int32" /> 
</FilterParameters> 
</asp:SqlDataSource> 
+4

Разве это не очень своеобразный дизайн базы данных? Почему вы хотите сохранить количество доступных мест на * каждом ряду * в таблице тренировок? Там будет только одна строка с правильным значением, остальные будут мусором ... – mortb

+0

Похоже, вам нужно уникальное ограничение на (DateId, LocationId, CourseId) –

+0

Я бы подумал, что какая-то таблица (возможно, tblCourses) будет иметь общее количество доступных мест для каждого курса. Затем вы вычитаете количество зарегистрированных участников (они кажутся рядами в таблице тренировок?) Из этого общего количества доступных мест, чтобы получить текущее количество доступных мест. – mortb

ответ

1

Вы можете попробовать подзапрос для подсчета строк и вычитают из DEFUALT Capacity_Seating:

select DISTINCT l.LocationId, 
c.courseId, 
c.coursename, 
c.Capacity_Seating - (select count(*) 
     from tblTrainings t1 
     where l.locationId = t1.LocationId and c.courseId = t1.courseId) as 
availableSeats, 
d.dateid, 
d.trainingDates, 
d.trainingtime, 
c.CourseDescription, 
i.instructorName, 
l.location, 
l.seating_capacity 
        from tblLocations l 
        Inner Join tblCourses c on l.locationId = c.locationId 
        left join tblTrainings t on l.locationId = t.LocationId and c.courseId = t.courseId 
        Inner Join tblTrainingDates d on c.dateid=d.dateid 
        Inner Join tblCourseInstructor ic on c.courseId = ic.CourseId 
        Inner Join tblInstructors i on ic.instructorId = i.instructorId 
+0

PERFECT @mortb. Это работало как сон. Я не знаю, что произойдет, если сиденье отменено и будет отложено, как указано на пингвине. Я проверю это позже, но этот запрос работает. – Kenny

+0

Также добавлен Capacity_Seating для вычитания из ... – mortb

+0

Это будет работать для отмененных мест, если вы УДАЛИЛИ строку из tblTrainings, когда сиденье отменено. Если вы не удалите строку, я бы предположил, что вы ее как-то пометили (например, столбец с именем «Отмененный», который получает значение 1, когда сиденье отменено). Если у вас есть решение с «отмененным» столбцом, вам просто нужно положить и отменить = 0 в предложение where подзаголовка – mortb

1

Когда новый пользователь подписывается на курс, вам нужно

UPDATE table_name 
SET AvailableSeats = ... 
WHERE TrainingID=... AND CourseId=... 

, а не делать в INSERT.

Должна быть только одна строка с уникальным (DateId, LocationId, CourseId) набором значений.

+0

Существует таблица tblDate с уникальным dateId. Существует tblLocation с уникальным местоположениемId, то же самое с tblCourses и tblInstructors. TblTrainings - это как основной стол, в котором у вас было бы соотношение 1: M с таблицами, упомянутыми выше. – Kenny

+0

@ Kenny Я бы рекомендовал составной первичный ключ, состоящий из трех из них. Не ставьте их вместе: SQL-сервер может эффективно обрабатывать многочастный ключ на своем собственном. См. Http://stackoverflow.com/questions/3922337/how-to-create-composite-primary-key-in-sql-server-2008 – penguat

Смежные вопросы