Avatar billede lauritsen Nybegynder
13. april 2001 - 00:11 Der er 44 kommentarer og
1 løsning

Posten før/efter

Kan det umiddelbart lade sig gøre at få fat i posten der står umiddelbart før (og efter) den post man har fået returneret i en tabel uden en fortløbende id-kolonne? Evt. efter en sortering?

Det, jeg tænker på, er hvis man har en tabel der ser ud som følger:

...
010179-1234  Egon    7
190868-4321  Poul    4
311299-3412  Ib      9
...

Jeg har nu lavet en SELECT, der får fat på Pouls kolonne, men jeg vil gerne have fat i Egons og Ibs også. Findes der en nem måde at gøre det på uden at skulle til at implementere en fortløbende id-kolonne?

Det allerbedste ville være hvis hele tabellen kunne blive sorteret først (via ORDER BY). Og altså ikke efter \'udvælgelsen\', da det ikke vil have megen effekt..
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:15 #1
det er ikke let med LIMIT kan du få fat i ibs sådan 0,2 desværre virker -1,3 nok ikke
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:17 #2
sorterer du efter 7 4 9
Avatar billede andreas Nybegynder
13. april 2001 - 00:23 #3
limit 1,2 tager den første
limit 2,3 tager nr 2 i rækken
limit 3,4 tager nr 3 i rækken
Avatar billede lauritsen Nybegynder
13. april 2001 - 00:24 #4
Nu er det bare et eksempel hertil, så vi kan godt sige at jeg sorterer efter 7 4 9.. Eller efter navnene.. Gør det en forskel; jeg kan ikke se den?
Avatar billede alvion Nybegynder
13. april 2001 - 00:26 #5
Hvis vi nu siger at $ID indeholder Pouls id

Posten før:

select * from tabel where id < $ID order by id desc limit 1


posten efter

select * from tabel where id > $ID order by id limit 1
Avatar billede lauritsen Nybegynder
13. april 2001 - 00:26 #6
Hvis vi siger navne-kollonnen hedder navn, så vil min sql-sætning lyde som følger:

select * from stories where navn like \'Poul\'

så bliver det ikke lidt svært med limit?
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:27 #7
limit 0,2

tager fra nr 0 (den første) til nr 2 (den tredie)
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:27 #8
i søge resultatet
Avatar billede lauritsen Nybegynder
13. april 2001 - 00:28 #9
alvion>
hmm.. jeg burde nok have sagt at der er mange poster i tabellen.. ikke kun de tre i eksemplet
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:29 #10
hvis du på en eller anden måde skal have den før og den efter må der vel være en logik i rækkefølgen - altså en sortering, ikk\'

Avatar billede mortenfn Nybegynder
13. april 2001 - 00:30 #11
for hvis der ikke er en logik - jamen så kunne du jo state med poul og de to mæste.
Avatar billede lauritsen Nybegynder
13. april 2001 - 00:33 #12
i eksemplet ovenfor vil der kun være én ved navn Egon, osv (primær nøgle), og jo det ville være bedst hvis der blev sorteret på navn inden de tre (den oprindelige og en på hver side) blev udvalgt
Avatar billede alvion Nybegynder
13. april 2001 - 00:38 #13
Ja, men min version burde kunne håndtere alle de poster du vil...

Det var sådan nogle \"næste\" og \"forrige\" links, ikke? Prøv den og se om den ikke virker
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:39 #14
du kan snyde mysql ved at lave to søgninger. En hvor du sorter i stigende og udvælger limit 2 - altså poul og ib. Derefter sorterer du faldene og udvælger 1,1 altso egon tilsidst udskriver du de to søgninger i regtig række følge.

fik du den
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:43 #15
order by $navn desc limit 2

order by $navn asc limit 1,1

sådan
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:44 #16
hov duer ikke
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:44 #17
jo den gør
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:46 #18
nej det gør ikke. jeg kan ikke blive helt ening med mig selv
Avatar billede lauritsen Nybegynder
13. april 2001 - 00:47 #19
alvion>
Jo, det er lige nøjagtig sådan nogle næste/forrige-links ;-)

Problemet er bare at der ikke er en kolonne, med et entydigt id ud over navn.. (ok, det var nok lidt misvisende at lave en cpr-kolonne - i ovenstående eksempel kan personer have samme cpr ;-)

mortenfn>
jep, jeg fik den.. Virker den også når nu jeg bruger where navn likes \'Poul\'? Nå, jeg prøver..
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:49 #20
nej
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:51 #21
du kan lægge hele resultatet ud i en array og derefter finde hvilket nummer poul har og derefter udskrive den før og den eftér
Avatar billede lauritsen Nybegynder
13. april 2001 - 00:54 #22
så ville det vist være nemmere at implementere en id-kolonne med fortløbende numre ;-)
Avatar billede lauritsen Nybegynder
13. april 2001 - 00:55 #23
hov, nej det går jo heller ikke når jeg sorterer på navn.. så bliver det nok arrayet..
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:55 #24
yep en array vil blive lidt indviklet
Avatar billede mortenfn Nybegynder
13. april 2001 - 00:57 #25
så er du nødtil at sorterer select lægge det i en array finde nr på poul o.s.v.
Avatar billede lauritsen Nybegynder
13. april 2001 - 01:00 #26
jep, det må blive det.. Takker for ideen..
Avatar billede andreas Nybegynder
13. april 2001 - 01:01 #27
$row1 = mysql_fetch_array(mysql_query(\"select id from tabel where name = \'Ib\'\"));
$row2 = mysql_fetch_array(mysql_query(\"select id from tabel where name = \'Egon\'\"));
$row3 = mysql_fetch_array(mysql_query(\"select name from tabel where id < \'$row2[id]\' and id > \'$row1[id]\'\"));

$row3[name] vil indeholde navnet Poul
Avatar billede andreas Nybegynder
13. april 2001 - 01:01 #28
argh... skod...
Avatar billede mortenfn Nybegynder
13. april 2001 - 01:01 #29
takker det var flot ;o)
Avatar billede andreas Nybegynder
13. april 2001 - 01:02 #30
han nåede lige at acceptere jeres svar inden mit kom... skod skod skod
Avatar billede mortenfn Nybegynder
13. april 2001 - 01:04 #31
andreas -> den duer ikke ib og egon er ukendte faktore - det er dem du skal finde
Avatar billede mortenfn Nybegynder
13. april 2001 - 01:04 #32
og der er ingen id i tabellen
Avatar billede andreas Nybegynder
13. april 2001 - 01:05 #33
nårh... det sagde han ikke...
Avatar billede lauritsen Nybegynder
13. april 2001 - 01:06 #34
andreas>
Takker for idéen, men den ville desværre ikke gå alligevel. Jeg har kun ét navn at gå ud fra, og vil finde de to andre - ikke modsat ;-)
Avatar billede andreas Nybegynder
13. april 2001 - 01:06 #35
så kan det ikke lade sig gøre...
Avatar billede andreas Nybegynder
13. april 2001 - 01:08 #36
hvis du havde et id felt, så kunne jeg godt lave det til dig....
Avatar billede mortenfn Nybegynder
13. april 2001 - 01:09 #37
andreas> læs lige oppe på siden
Avatar billede andreas Nybegynder
13. april 2001 - 01:11 #38
med id felt!
<?
$row1 = mysql_fetch_array(mysql_query(\"select id from tabel where name = \'Ib\'\"));  // så ved vi hvor han er

$query1 = mysql_query(\"select id from tabel \"); 
while ($temprow = mysql_fetch_array($query1)) $array[] = $temp_row[id];

$pointer = $array[$row1[id]]+1;

$row1 = mysql_fetch_array(mysql_query(\"select id from tabel where id = \'$pointer\'\"));
?>

prøv at lege med dette
Avatar billede andreas Nybegynder
13. april 2001 - 01:12 #39
eller

$row1 = mysql_fetch_array(mysql_query(\"select id from tabel where name = \'Ib\'\"));  // så ved vi hvor han er

$row2 = mysql_fetch_array(mysql_query(\"select id from tabel limit $row1[id],1\"));


Avatar billede lauritsen Nybegynder
13. april 2001 - 01:15 #40
andreas>
hvis jeg implementerer en id vil id 3 og id 4 højst sansynligt ikke stå ved siden af hinanden når jeg sorterer efter navn
Avatar billede andreas Nybegynder
13. april 2001 - 01:17 #41
synes det er underligt det du vil....
Avatar billede andreas Nybegynder
13. april 2001 - 01:17 #42
prøv evt også at leg med noget order by *S*

nu går jeg i seng... natter
Avatar billede lauritsen Nybegynder
13. april 2001 - 01:18 #43
Jeg tror arrayet er den eneste umiddelbare løsning.. Godt det er en forholdsvis kort tabel alligevel.. mit bud er at den aldrig kommer over 500 poster, så det burde gå an, selvom det vist ikke er dokumenteret i nogen SQL-bog ;-)
Avatar billede lauritsen Nybegynder
13. april 2001 - 01:26 #44
underligt? hvorfor? nu var det et tænkt eksempel.. Jeg kan da godt afsløre hvad den rigtige tabel går ud på, men jeg syntes bare at det var nemmere med et konstrueret eksempel frem for at sætte folk ind i den rigtige.. anyway here goes:
Tabellen er et indeks over en bestemt tegneserietegners historier. De har alle en unik storycode (som meget vel kan indeholde bogstaver, fx AR103) - det er min primære nøgle, og det eneste man kan \"kende\" en historie på. Det, jeg sorterer på er en dato for historien og derefter storycode\'n. Jeg har så en webside, der præsenterer en enkelt historie, og vil gerne lave en mulighed for at springe direkte til den næste historie. Dvs. den næste storycode efter AR103 godt kan risikere fx at være D90134.. Og da historier ikke nødvendigvis tilføjes sekventielt, kan jeg ikke bruge en id til noget ;-)
(og jo, jeg bruger order by)
Avatar billede mortenfn Nybegynder
13. april 2001 - 01:29 #45
ok .....natter
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester