webForumDet fria alternativet

Föregående och nästa post i SQL sats?

Databaser & SQL

22 svar · 1 221 visningar · startad av Zaiman · sida 2 av 2

Frågan, av Zaiman

Har idag en fråga som jag tänkte göra om så att jag får ut föregående,denna och nästa post. Om det nu finns någon föregående eller nästa post såklart. Databas = Access, SQLServer 2000 SQL= "SELECT id, ImageL, Imagetext FROM tblImages WHERE id =" & Request.Querystring("ImageID") Så ser frågan ut idag.. Och nej.. jag har inte sökt i forumet ännu.

Läs frågan i sin helhet →
Medlem sedan juni 200032 967 inlägg
#21

En tanke är att TOP inte har något syfte när man inte har ORDER BY., så du kan ju prova att ta bort "TOP 1" ur mitt kodförslag ovan.

I övrigt kan ditt DISTINCT-felmeddelande bero på att du använder en vanlig UNION, som ju per definition är DISTINCT. Använd UNION ALL istället, så borde du komma förbi det.

Edit: LarsG, mästaren på simultanpostning, eller är det jag det? ;) :bire

mvh

Medlem sedan dec. 20014 239 inlägg
#22
SELECT TOP 1 id2, image_text FROM tbl_Images WHERE id2 < 7 AND Gallery_name = 18 order by id2 desc
UNION ALL
SELECT TOP 1 id2, image_text FROM tbl_Images WHERE id2 = 7 AND Gallery_name = 18
UNION all
SELECT TOP 1 id2, image_text FROM tbl_Images WHERE id2 > 7 AND Gallery_name = 18 order by id2

Okej...
Fungerar i Access men ej i SQL Server 2000, SQL Server 2005

Det löser ju problematiken temporärt eftersom jag inte gjort resten färdig för SQL ännu.
SQL klagar på UNION ALL som ett syntax error.. mycket knasigt.

Medlem sedan dec. 19996 721 inlägg
#23

SQL Server gillar inte att man har ORDER BY före en UNION, men det går att lösa genom att bryta ut sökningarna i deriverade tabeller.

SELECT id2, image_text FROM (SELECT TOP 1 id2, image_text FROM tbl_Images WHERE id2 < 7 AND Gallery_name = 18 order by id2 desc) T
UNION ALL
SELECT id2, image_text FROM (SELECT TOP 1 id2, image_text FROM tbl_Images WHERE id2 = 7 AND Gallery_name = 18) T
UNION all
SELECT id2, image_text FROM (SELECT TOP 1 id2, image_text FROM tbl_Images WHERE id2 > 7 AND Gallery_name = 18 order by id2) T

Om du vill ha ut allt på en rad, så kan du använda subqueries. Dock får du bara ut id-numren på den föregående och nästa posten, men jag kan tänka mig att det är det som är intressant

SELECT i.ID,i.Gallery_name,(SELECT TOP 1 i2.ID FROM tbl_Images i2 WHERE i2.ID<i.ID AND i2.Gallery_name=i.Gallery_name ORDER BY i2.ID DESC) as PrevImage , (SELECT TOP 1 i3.ID FROM tbl_Images i3 WHERE i3.ID>i.ID AND i3.Gallery_name=i.Gallery_name ORDER BY i3.ID ASC) as NextImage
FROM tbl_Images i
WHERE i.id2 = 10 AND i.Gallery_name = 18

Vill man verkligen ha ut de andra kolumnerna också, så går det, genom att använda den ovanstående sökningen som en deriverad tabell, men vi kanske inte ska röra till det i onödan. :)

258 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)