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
16 svar · 353 visningar · startad av ampy
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?
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
Just det, glömde nämna att det gäller MySQL.
Då funkar väl inte top?
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?
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
Hur gör man om man kan använda union då?
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.
Då har du nog en version av mysql som inte stöder union.
Hur kolllar man upp vilken version man har?
mysqld -V
Vart ska man skriva det?
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?
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
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
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
Tack! :bire