Jump to content
php.lv forumi

Atcelt automātisku datu kārtošanu?


Lynx

Recommended Posts

Saskāros ar interesantu problēmu, ir šāds te sql pieprasījums:

 

SELECT something FROM karte WHERE id BETWEEN 4850 AND 4860 OR id BETWEEN 4950 AND 4960 OR id BETWEEN 50 AND 60 OR id BETWEEN 150 AND 160 OR id BETWEEN 250 AND 260

 

Pamatvajadzība ir, ka tieši šādā secībā kā rakstīts pieprasījums dati tiek atgriezti attiecīgi sāk 4850-4860, tad 4950-4960, tālāk seko 50-60 etc. Mysql automātiski bez nekādiem norādītiem ORDER BY saliek sākot no zemākā: 50-60, 150-160, 4850-4860.

 

Pētiju manuāli, iespējas šo fīču atcelt neatradu, varbūt kāds ir meiģinājis kaut ko līdzīgu veidot?

Ja tas nav iespējams tad veidošu ar php, vienkārši tikai ar mysql būtu ērtāk, varbūt pat ātrāk?

Link to comment
Share on other sites

marcis, ORDER BY Desc nestrādā - tad jau vispār nebūtu jautājums. Pārveidojot tos pašus datus vieglāk uzskatāmos sanāk: 9 10 1 2 3. Kā redzi 2as dažādas secības dati wrapojas. Ar desc būtu 10 9 3 2 1

 

Aleksandrs, tieši tā - tapēc arī ir šis topiks.

 

Pameiģināšu realizēt andrisp variantu.

Link to comment
Share on other sites

Saskāros ar interesantu problēmu...

Tā nav nekāda problēma. Tā ir relāciju datu bāžu specifika - tās nu nekādīgi negarantē atgriezto ierakstu kārtību rezultāta datasetā. Vai nu uzdod pats kārtību ar ORDER BY pēc kautkā (kaut vai RAND funkcijas rezultātu), vai arī paļaujies uz kautkādu-sazinkādu kārtību. Visdrīzāk vien tev jādara kā andrisp saka. Tik par ātrdarbību gan tad būs jāpiedomā.. vai mysql tur joprojām izmantos indeksu?

Link to comment
Share on other sites

DB dati parasti tiek rakstiiti peec kartas Un taa arii nolasiiti atgriezti, taja briidi kad izdzees kadu ierakstu , paliek tuksa vieta kur nakamrez tiek ierakstiitas jauna vertiba.....

tb... Ja sakuma buus 1;2;3;4;5 un izdzesiisi teiksim 3 ierakstu + pievienosi vel vienu tad buus jau

1;2;6;4;5 ...... Un taa taalak....

Link to comment
Share on other sites

Ja kādā vaicājumā ir svarīga atgriezto datu kārtība, tad __vienmēr__ ir jālieto ORDER BY. SQL standarts saka, ka, ja ORDER BY klauzas nav, tad sakārtojums ir implementācijas specifisks.

20.2 <direct select statement: multiple rows>

4) If an <order by clause> is not specified, then the ordering of

the rows of Q is implementation-dependent.

Ja nu gadījumā MYSQL dokumentācijā kaut kur ir rakstīts (par ko es šaubos :), ka dati vienmēr tiek atgriezti ierakstīšanas kārtībā un ka tas tiks nodrošināts tā arī uz priekšu, tad varbūt tādā gadījumā priekš tā konkrētā sakārtojuma ORDER BY arī var nerakstīt, bet, ja tas nekur dokumentācijā tā rakstīts nav, tad arī tas, ka līdz šim man vienmēr datus deva ārā sakārtotus, nav nekāds iemesls nerakstīt ORDER BY klauzu.

Piemērs iz Oracles. Līdz 9i versijai GROUP BY rezultātā parasti ieraksti tika sakārtoti blakusefekta rezultātā - lai iegūtu grupēšanas funkcijas rezultātu, ieraksti tika sakārtoti un tā rezultātā dažiem radās maldīga ilūzija, ka group by kārto datus, lai gan Oracle speciāli dokumentācijā vienmēr rakstīja, ka bez ORDER BY nekāds sakārtojums garantēts netiek. Nu lūk un tad radās jauns mehānisms group by implementācijā - HASH GROUP BY - un tā rezultātā jau dati vairs parasti __nav__ sakārtoti. Un tagad diemžēl tā ir (nu jau gan vairāk bija) diezgan izplatīta problēma spriežot pēc forumu jautājumiem. Tā kā nevajag radīt sev liekas potenciālas problēmas ar ko vēlāk būs nevajadzīgi jācīnās.

BTW es par to rakstīju arī šeit Vienkāršs SQL Select teikums

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

×
×
  • Create New...