webForumDet fria alternativet

Hämta närliggande id-nummer

Databaser & SQL

16 svar · 353 visningar · startad av ampy

Medlem sedan feb. 20011 498 inlägg
Frågan#1

Om det tex ser ut så här i en kolumn:

1
3
8
12
25
27

Och jag har värde 12 i ett variabel. Hur gör jag nu för att hämta de närliggande id-nummer som ligger precis efter och precis före? Alltså i detta fall vill jag få ut 8 och 25.

Hur gör man detta med en sql-sats?

Medlem sedan juni 20022 599 inlägg
#2

Kanske finns nåt enklare men kommer inte på nåt ..

select top 1 id from tbl where id<x order by id desc union select top 1 id from tbl where id>x order by id
Medlem sedan feb. 20011 498 inlägg
#3

Just det, glömde nämna att det gäller MySQL.
Då funkar väl inte top?

Medlem sedan juni 20022 599 inlägg
#4

Nä, men det går ju att ersätta med LIMIT. Vad som är värre är att UNION bara funkar from 4.0.0. Kör du inte den så har jag nog ingen riktigt bra lösning förutom att lösa det i ASP/PHP-koden (eller vad du nu kör).

Kanske nån annan som vet?

Medlem sedan dec. 200012 464 inlägg
#5

Om du inte kan använda union så får du ställa två frågor

select min(id) from t where id > 12

select max(id) from t where id < 12
Medlem sedan feb. 20011 498 inlägg
#6

Hur gör man om man kan använda union då?

Medlem sedan dec. 200012 464 inlägg
#7

select min(id) from t where id > 12
union
select max(id) from t where id < 12

Medlem sedan feb. 20011 498 inlägg
#8

Jag har nu skrivit så här:

	sql = 	"select min(id_trad) from forum_topics where id_trad > "&strDatat(1,0)&" " & _
		"union " & _
		"select max(id_trad) from forum_topics where id_trad < "&strDatat(1,0)&""
	set rs = connect.execute(sql)
	
	response.write rs(0) & "-" 
	response.write rs(1)

	set rs = nothing

Då får jag felmeddelandet:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E09)
[TCX][MyODBC]You have an error in your SQL syntax near 'union select max(id_trad) from forum_topics where id_trad < 3' at line 1

Varför?

strDatat(1,0) innehåller ett värde. Har kollat det.

Medlem sedan dec. 200012 464 inlägg
#9

Då har du nog en version av mysql som inte stöder union.

Medlem sedan feb. 20011 498 inlägg
#10

Hur kolllar man upp vilken version man har?

Medlem sedan juni 20022 599 inlägg
#11
mysqld -V
Medlem sedan feb. 20011 498 inlägg
#12

Vart ska man skriva det?

Medlem sedan feb. 20011 498 inlägg
#13

Har gjort så här nu:

sql = 	"select min(senasteinlagg), id_trad from forum_topics where senasteinlagg > '"&strDatat(33,0)&"' AND rum = "&rum&""

Då får jag felmeddelandet:

TCX][MyODBC]Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

Varför?

Medlem sedan feb. 20012 412 inlägg
#14

mysql vill ha med group by när du använder en aggregat funktion. Du kan läsa mer här:
http://www.mysql.com/doc/en/Group_by_functions.html

Medlem sedan feb. 20011 498 inlägg
#15

Kom på att jag inte alls vill hämta det närmaste ID:t utan jag vill hämta id:et från närmaste tiden:

databasen ser ut så här:
--ID--------Datum-------------
| 2 | 2002-12-31 11:00:00 |
| 1 | 2002-12-31 12:00:00 |
| 3 | 2002-12-31 10:00:00 |
| 4 | 2002-12-31 08:00:00 |
| 5 | 2002-12-31 09:00:00 |

Om vi nu har id-nummer 3 i en variabel, hur ska vi då får ut 2 och 5 genom att hämta den tiden som ligger närmast?

Strulade lite
Lars

Medlem sedan dec. 200012 464 inlägg
#16

Id för närmast mindre tid

select t1.* from topics t1 inner join topics t2 
  on t1.datum < t2.datum 
where t2.id = 3
order by t1.datum desc
limit 1

Id för närmast större tid

select t1.* from topics t1 inner join topics t2 
  on t1.datum > t2.datum 
where t2.id = 3
order by t1.datum asc
limit 1
Medlem sedan feb. 20011 498 inlägg
#17

Tack! :bire

268 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)