/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Speciel sortering - tælle bits
Fra : Bjarke Walling Peter~


Dato : 19-11-03 00:12

Hej.

Kort sagt: Jeg ønsker at sortere et talfelt på antallet af 'tændte' bits,
der er i det. Hvordan gør jeg dette?

Den lange historie:

Jeg har et talfelt i en tabel i min MySQL-database der indeholder nyheder.
Dette talfelt angiver hvilke steder at nyheden skal vises og er en slags
bit-matrix - hver bit i tallet står for ét af de steder nyheden kan vises.
Det virker fint nok. Nu er det blot det at jeg i administrationssystemet
gerne vil kunne sortere efter, hvor den vises. Hvorfor er det så ikke blot
at sætte en 'order by' ind på netop det felt?, vil nogle måske spørge.
Grunden er at det åbenbart kun er en sortering, som er enten stigende eller
faldende - mig bekendt er der ikke andre. Det jeg gerne vil, når jeg
sorterer, er at først finder den alle de steder, hvor nyheden kun bliver
vist ét sted - dernest alle de steder den bliver vist to steder, etc. Man
kan nærmest sige at den skal tælle antal bits og sortere efter det - det er
dog lidt uhåndgribeligt sagt, måske. Jeg har tænkt over det, men er ikke
umiddelbart kommet frem til et større resultat - men man må kunne lave en
omregning fra status-tallet til det nr. i rækken det skal komme frem under
en sortering. Eksempel med 3 bits (tallet går fra 0-7):
Tal Sortering (Antal 1-bits)
0 1 (0)
1 2 (1)
2 3 (1)
3 5 (2)
4 4 (1)
5 6 (2)
6 7 (2)
7 8 (3)
Som det ses er 0 først, fordi det indeholder 0 1-bits - 1, 2 og 4 kommer
efter, fordi de indeholder én 1-bit og herefter 3, 5, 6 med 2 1-bits og til
sidst 7 med alle tre 1-bits. Håber nogen forstår systemet.

Kan man få databasen til at sortere på ovenstående metode? Og hvad, hvis det
ikke er muligt? Skal jeg foretage en slags konvertering af status-tallet,
før jeg gemmer det - og tilbage igen, når jeg skal bruge det? Skal jeg
oprette et ekstra felt, hvor den konverterede værdi gemmes i (som man
sorterer på) og så beholde et felt, der gemmer den korrekte status-værdi? De
sidste nævnte løsninger kører jo på min applikation, der kommunikerer med
databasen - det ville være rart, hvis jeg kunne lave det, så databasen
klarede arbejdet.
Sidst men ikke mindst: Er der nogen der kan se en nem og elegant måde at
konvertere fra status-tallet til nr. for sortering - og omvendt? (hvis jeg
har brug for det) Det skal måske lige nævnes at der er tale om et 5-bit tal
(5 mulige steder at nyheden kan vises), dvs. 0-31 - konverteringsfunktionen
afhænger vel af det maksimale antal bits.

Måske det generelt er en dumt at gemme bit-værdier i en database? Det er
blot irriterende, hvis jeg skal til at lave det om, nu hvor hele mit system
er programmeret til at køre med denne bit-status-værdi.

Håber nogle kan og vil svare. På forhånd tak!

Mvh. Bjarke



 
 
Nikolaj Hansen (19-11-2003)
Kommentar
Fra : Nikolaj Hansen


Dato : 19-11-03 03:05

Det du lyder til at være ude efter er en N:M relation mellem din "Nyhed" og
din "HTMLSide". Dvs. at en nyhed kan vises på flere sider og en side kan
have flere nyheder.

Det kan man da bare lave som en ganske gængs N:M relation med en mellem
tabel?

Det kan du både indeksere og sortere korrekt efter i en alm. relationel
database.

- Nikolaj



Bjarke Walling Peter~ (19-11-2003)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 19-11-03 03:52

Nikolaj Hansen skrev:
> Det du lyder til at være ude efter er en N:M relation mellem din "Nyhed"
og
> din "HTMLSide". Dvs. at en nyhed kan vises på flere sider og en side kan
> have flere nyheder.
>
> Det kan man da bare lave som en ganske gængs N:M relation med en mellem
> tabel?
>
> Det kan du både indeksere og sortere korrekt efter i en alm. relationel
> database.

Jo. Det er ærgeligt at jeg ikke tænkte på det FØR jeg lavede det hele, men
jeg har faktisk (desværre først nu) overvejet denne mulighed. Det kræver
blot mange ændringer, men det kan være at det bliver den endelige løsning.

Tak for svaret.

Mvh. Bjarke



Anders Wegge Jakobse~ (19-11-2003)
Kommentar
Fra : Anders Wegge Jakobse~


Dato : 19-11-03 17:27

"Bjarke" == Bjarke Walling Petersen <bwp.news@bwp.dk> writes:

> Hej.
> Kort sagt: Jeg ønsker at sortere et talfelt på antallet af 'tændte' bits,
> der er i det. Hvordan gør jeg dette?

...

> Sidst men ikke mindst: Er der nogen der kan se en nem og elegant måde at
> konvertere fra status-tallet til nr. for sortering - og omvendt? (hvis jeg
> har brug for det) Det skal måske lige nævnes at der er tale om et 5-bit tal
> (5 mulige steder at nyheden kan vises), dvs. 0-31 - konverteringsfunktionen
> afhænger vel af det maksimale antal bits.

Hvis du har et endeligt antal bits, kan du nok fuske noget sammen i
retning af:

SELECT * FROM tabel ORDER BY ((bitfelt & 1) + (bitfelt & 2) / 2 +
(bitfelt & 4) / 4 + ...)

Kønt er det ikke, men det kan formentlig komme til at virke.


> Måske det generelt er en dumt at gemme bit-værdier i en database? Det er
> blot irriterende, hvis jeg skal til at lave det om, nu hvor hele mit system
> er programmeret til at køre med denne bit-status-værdi.

En bitvektor giver en meget effektiv pladsudnyttelse, men det vil
måske kunne hjælpe dig i det lange løb med et view der kan konvertere
bitværdierne til/fra noget mere læseligt. Så har du også mulighed for
at flytte dit system glidende fra bitrepræsentation til noget andet.

--
/Wegge <http://outside.bakkelygaard.dk/~wegge/>
echo mail: !#^."<>"|tr "<> mail:" dk@wegge

Bjarke Walling Peter~ (19-11-2003)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 19-11-03 18:03

Anders Wegge Jakobsen <wegge@bakkelygaard.dk> skrev:
> Hvis du har et endeligt antal bits, kan du nok fuske noget sammen i
> retning af:
>
> SELECT * FROM tabel ORDER BY ((bitfelt & 1) + (bitfelt & 2) / 2 +
> (bitfelt & 4) / 4 + ...)
>
> Kønt er det ikke, men det kan formentlig komme til at virke.

Hmm... tja.. det har du ret i. Jeg tror nu blot jeg prøver at lægge det om -
én gang for alle - hvis jeg ellers kan finde ud af at opbygge databasen mere
"korrekt".

> En bitvektor giver en meget effektiv pladsudnyttelse, men det vil
> måske kunne hjælpe dig i det lange løb med et view der kan konvertere
> bitværdierne til/fra noget mere læseligt. Så har du også mulighed for
> at flytte dit system glidende fra bitrepræsentation til noget andet.

Ja, det kunne være smart, men nu er det jo som sagt en MySQL-database,
hvorfor den ikke understøtter views - desværre. "MySQL - få det lavet!"

Mvh. Bjarke



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste