Avatar billede kratluskeren Nybegynder
12. oktober 2004 - 16:23 Der er 13 kommentarer og
1 løsning

MySQL: hent placering af post i recordset

Hej
Når jeg foretager en søgning i min MySQL får jeg leveret en række resultater i et recordset som jeg kan udskrive, bladre i  etc. jeg har brug for at kende placeringen på en given post i dette recordset.

Eksempel på recordset efter at have søgt på '%juice' :
bananjuice
æblejuice
jordbærjuice
kattejuice


Kan MySQL nemt fortælle mig at jordbærjuice har placering 3?

Min liste over Juice indeholder 100.000 forskellige varianter så det er ikke så fedt at køre dem alle igennem i ASP for at finde placeringen på jordbærjuice
Avatar billede baitianlong Nybegynder
12. oktober 2004 - 19:40 #1
Du kan ændre dit Recordsæt til et array:

Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "SELECT * FROM Table1", objConn

Dim arrayJuice
arrayJuice = objRS.GetRows()

og finde placeringen med arrayJuice.indexOf("jordbærjuice")

:)
Avatar billede majkat Nybegynder
12. oktober 2004 - 20:04 #2
SET @c=0

SELECT *, @c:=@c+1 AS rownum
FROM tabel
Avatar billede kratluskeren Nybegynder
12. oktober 2004 - 21:05 #3
legende.dk => dette er vist ikke så smart hvis vi forestiller os at der er temmelig mange poster den skal håndtere. Så må det alt andet end lige være smartere hvis MySQL kan levere varen fra starten af :)


Majkat => Det er sikkert smart, men jeg forstår ikke helt hvad der sker.
Følger der en forklaring? :D
Avatar billede majkat Nybegynder
12. oktober 2004 - 21:15 #4
Avatar billede baitianlong Nybegynder
12. oktober 2004 - 21:26 #5
ok, men du siger du vil finde et nummer i et RecordSet, men du mener du vil finde et nummer i en tabel... eller noget ?!
Avatar billede kratluskeren Nybegynder
12. oktober 2004 - 21:30 #6
Ah nu begynder det at give mening.
Det dækker dog ikke umiddelbart mit behov. Jeg har vist ikke forklaret mig godt nok.

Jeg ønsker ikke at finde placeringen på alle poster, men blot dykke ned og hive en enkelt placering ud. Forestil dig jeg siger: kære MySQL, stik mig lige position på jordbærjuice!
Avatar billede kratluskeren Nybegynder
12. oktober 2004 - 21:35 #7
legende.dk =>  jeg ønsker at finde nummeret i et recordset så dit forslag funktionelt, men jeg mener bare ikke det er en optimal løsning idet den ikke er egnet til at håndtere store datamængder :)
Avatar billede majkat Nybegynder
13. oktober 2004 - 08:11 #8
Det du vil giver ingen mening i database-sammenhæng. SQL er baseret på sætteori, og der ved du per definition ikke hvor i tabellen dine data ligger -- bare at de er der, og kan findes frem igen.

F.eks. kan en SQL database fint finde på at indsætte en række før din "jordbærjuice" række, hvorefter positionen ikke længere er korrekt -- eller hvis du selv sletter en række, så passer positionen jo heller ikke længere.

Hvis du vil have en unikt tal for hver række i din tabel skal du lave en ID kolonne, f.eks.

ALTER TABLE tabel ADD ID INT UNSIGNED NOT NULL AUTO_INCREMENT

- så vil du herefter altid have unikke tal for hver række i din tabel.
Avatar billede kratluskeren Nybegynder
13. oktober 2004 - 12:29 #9
Hej igen
Det er ikke id på tabellen jeg ønsker!
Det er placeringen i mit recordset. Dit første forslag var ret godt idet det gav mig placeringerne på alle poster i mit recordset. Jeg ønsker dog muligheden for plukke en af placeringerne udfra det id (her jordbærjuice) jeg kender.
dvs.
jeg får et dataudtræk der består af en hel stribe poster sorteret i en eller anden rækkefølge.
De har alle en placering i mit recordset - 1,2,3,4,5 osv.
Jeg ved at en af mine poster indeholder jordbærjuice (og der er kun den ene der gør det). Jeg ønsker således at få at vide hvilken placering denne post har i mit recordset, uden at skulle loope hele recordsettet igennem og kigge alle poster igennem.

giver det mening nu?
Avatar billede majkat Nybegynder
13. oktober 2004 - 14:54 #10
Er du sikker på det er en database og ikke et regneark, du har brug for? :-)

SET @c=0

SELECT *
FROM (
  SELECT *, @c:=@c+1 AS rownum
  FROM tabel) AS a
WHERE type='æblejuice'

-- det virker i MySQL 4.1. I forudgående udgaver skal du bruge 2 skridt a la

SET @c=0

CREATE TEMPORARY TABLE t
SELECT *, @c:=@c+1 AS rownum FROM tabel

SELECT * FROM t WHERE type='æblejuice'

DROP TEMPORARY TABLE t
Avatar billede majkat Nybegynder
13. oktober 2004 - 14:56 #11
Bemærk at uanset at alt dette foregår inde i serveren er det helt horribelt i optimerings-øjemed. Men jeg kan ikke lige se andre løsninger (og det er stadigæk bedre end at trække alt ud til et andet program, konvertere til Array/Recordset eller hvad ved jeg)
Avatar billede kratluskeren Nybegynder
14. oktober 2004 - 16:55 #12
Tak for hjælpen. Jeg finder ud af noget :)
Avatar billede kratluskeren Nybegynder
20. oktober 2004 - 13:43 #13
Hej igen
Måske du lige kan svare på endnu et spg.
Jeg har kigget på din løsning:
SET @c=0

CREATE TEMPORARY TABLE t
SELECT *, @c:=@c+1 AS rownum FROM tabel

SELECT * FROM t WHERE type='æblejuice'

DROP TEMPORARY TABLE t

...men kan ikke helt se hvordan tabellen t bliver anvendt. Jeg går ud fra at søgeresultatet bliver smidt over i tabellen t - men hvor sker det i koden?
Mangler der ikke noget?
Avatar billede majkat Nybegynder
21. oktober 2004 - 10:42 #14
Så meget for at forsøge at gøre noget for læsbarheden :-)

Du skal læse

CREATE TEMPORARY TABLE t
SELECT *, @c:=@c+1 AS rownum FROM tabel

som:

  CREATE TEMPORARY TABLE t SELECT *, @c:=@c+1 AS rownum FROM tabel
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