2011-01-11 3 views
0

Я унаследовал базу данных с удаленными записями. Я работаю над таблицей новостей. Это означает, что есть некоторые недостающие id, где эти записи были удалены. Вы можете открыть любую новость в архиве (1000), а затем использовать следующую и предыдущую кнопки для навигации по всем новостям. В настоящее время, если вы перейдете к следующей удаленной записи, будет отправлен конец набора записей, и будет показано сообщение по умолчанию, в котором говорится, что «новость недоступна». Есть ли способ обнаружить эту пропущенную запись и перейти к следующей достоверной новостной новость (с идентификатором и т. Д.)? Я использую старый asp для этого сайта, есть ли способ обнаружить это при навигации по набору записей или будет ли этот тип функций поступать из базы данных, может быть, триггер? Спасибо за любую помощь.Выберите запись, если она не существует (удалена) - выберите следующую действительную запись

+0

Если вы идентификация этих элементов с помощью числового идентификатора, а предыдущие и последующие кнопки просто добавить или вычесть один, не означает ли это, что, если пункт-Безразлично 't существует, поэтому он открывает пункт 2, предыдущая кнопка снова свяжется с пунктом 2? Как это работает в настоящее время? – Rob

+1

Какая версия SQL-сервера? –

ответ

1

Для SQL Server 2005 и выше см. MSDN.

Вы можете использовать row_number, чтобы создать непрерывный столбец чисел.

0

1) Поскольку вы знаете, что это влияет на интерфейс пользователя (ваш «конец записи файла»), вы можете вручную увеличивать/уменьшать идентификатор и пытаться извлечь другую запись из БД, это кажется лучшим, что вы может обойтись без вхождения в базу данных. Но это может быть очень неэффективным, если отсутствуют многие записи подряд. Вместо этого я бы посоветовал изменить код в базе данных.

Предполагая, что вы запрос, как это:

SELECT * FROM News WHERE [email protected] 

где @Id это идентификатор, который вы пытаетесь извлечь. Вместо этого у вас будет что-то вроде этого:

SELECT * FROM News WHERE Id=(SELECT MIN(Id) FROM News WHERE Id>[email protected]) 

Это позволит вам выбрать первую доступную запись. Вы должны использовать MAX вместо MIN и < = вместо> = если вы будете искать «предыдущую» новость, пример выше должен работать для следующего новостного пункта.

Также не забывайте, что при таком подходе вам придется индексировать/уменьшать идентификаторы для следующих/предыдущих записей на основе значения, которое вы извлекли из базы данных, а не того, что вы искали. Пример: у вас есть следующие идентификаторы в вашей таблице SQL - 1,5,12,21. Вы открыли новостной элемент с Id = 1. Кнопка «Далее» начнет поиск Id> = 2 и вернет запись с Id = 5. Когда вы откроете его, ваша кнопка «Далее» должна искать запись с Id> = 6 (не 2).

Следующим моментом является то, что вам нужно будет предоставить не только идентификатор записи, которую вы пытаетесь извлечь, но и направление, в котором нужно искать. И этот параметр также должен быть передан в строке запроса HTTP.

Кроме того, этот подход может быть не очень удобно, так как все страницы с следующими адресами будет отображаться один и тот же предмет:?
сайта/news.asp Id = 2 & направления = следующий
сайта/news.asp Id? = 3 & направления = следующий
сайта/news.asp? Id = 4 & направления = следующий
сайта/news.asp? Id = 5 & направления = следующее

2) Поэтому, возможно, будет более удобным чтобы определить, какая запись будет следующей и предыдущей, когда вы показываете c текущая запись.В этом случае вам придется выполнить запрос, как это:

SELECT (SELECT MAX(Id) FROM News WHERE Id<@Id) as previousId, (SELECT MIN(Id) FROM News WHERE Id>@Id) as nextId 

, а затем соответственно обновить Urls для ваших «Previous» кнопки «Далее» &. Поэтому, если в предыдущем примере мы будем открывать новостной элемент с Id = 5, тогда кнопка «предыдущая» будет перемещаться непосредственно в Id = 1, а кнопка «Next» будет двигаться до Id = 12.

Я считаю, что второй подход еще лучше в вашем случае, поскольку он может быть реализован с меньшими изменениями, а также позволяет реализовать серию «Next» & «Предыдущие» ссылки, если соответствующие записи недоступны (вы будете знать это с помощью NULL, возвращаемого запросом для previousId или nextId).

Надеется, что это помогает :)

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