Ebresi epomevis eggrafis me xrovologiko ordering

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από Rapid-eraser » 05 Ιαν 2006 03:51

To problima eivai telios aplo ... alla egw dev mporw va brw lisi afti tnv stigmi ;P

O skopos eivai va givei mia oso pio database oriented lisi (mysql 4.0.x stnv periptosi mas) kai va apofigoume tov poli php kodika, kai afto gia logo eggrafwv ... > 1Grows

Esto oti ta rows mesa exouv `id` int timi
kai `timestamp` timestamp timi ...

to problima eivai to eksis exovtas mia afksousa ordering me
basi to `timestamp` kai gvorizovtas kapoio `id` psaxvoume
to epomevo kai proigoumevo `id`.

Xrovologika ta ids givovte me tixea sira kai etsi dev mporoume
va aksiopiisoume tnv ari8mitikotita afti .

H dies8isi mou leei pos prepei va dimiourgi8ei kapoio idos
ranking tou row kai me basi afto va evtopisoume ta epomeva
kai proigoumeva id
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από ThyClub » 05 Ιαν 2006 04:13

Δλδ έχεις κάτι σαν αυτό:

Κώδικας: Επιλογή όλων

id   timestamp
1    12124566
2    12124566
3    12124599
Δεν το κατάλαβα και πολύ καλά αλλά λογικά αν κάνεις μια εγγραφή τώρα και πάρει id 4 και stamp 12124900 πάλι θα μπορείς με αύξουσα σειρά το επόμενο id απλά προσθέτοντας 1 στο id που θα τραβήξεις τελευταίο?

Μπορεί και να είμαι εντελώς εκτός θέματος αλλά η ώρα είναι 4 + :P

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από Rapid-eraser » 05 Ιαν 2006 04:16

as agvoisoume ligo to timestamp sav pedio kai as to kratisoume sav meso ordering
esto lipov oti iparxei to eksis ordering me basi to timestamp
3,6,5,9,4,7,8,1,2

Esto oti gvorizeis tnv eggrafi 9.
H epomevi eivai n 4.
kai n proigoumevi n 5.

To ordering bgevei me basi to timestamp.

Ipev8imizo oti eimaste se 4.0.x mysql .. oute views oute stored prosedures oute UDF tipota :P
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από ThyClub » 05 Ιαν 2006 04:23

Και ο ζαλισμένος ThyClub ξαναρωτά:

Με την χρήση ενός array ίσως;

Κώδικας: Επιλογή όλων

$ordering='3,6,5,9,4,7,8,1,2';
$array=explode(',',$ordering);
foreach ($array as $key=>$value){
 if($value==$id){
  $currentKey=$key;

}
}

$previous=$ordering[$currentKey-1];
$next=$ordering[$currentKey+1];

??

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από ThyClub » 05 Ιαν 2006 04:29

Βέβαια μόλις τώρα κατάλαβα οτι είμαστε στο forum SQL Servers και ίσως είναι και τα πρώτα μου ποστ εδώ... :lol:

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από Rapid-eraser » 05 Ιαν 2006 09:25

Av eixa 10 eggrafes ta pragmata ntav apla ...
skepsou to idio pradigma me 1.000.000.000 eggrafes.

To string pou sou edosa apo pavo dev eixe va kavei me kati pou iparxei
ntav sximatika n sira twv id gia v akatalabeis pou eivai to problima.

Av kaveis order by me eva allo pedio xaveis to siriako twv dedomevwv tou `id`

Afto simevei pos dev mporeis va kaveis sigkrisi me basi to id
giati apla exei allaksei n sira. kai to row me id 1 dev simevei oti eivai
proto , to row me id 2 dev simevei oti eivai deftero aka...

Giafto zitisa tnv elaxistiopiisi tou kodika kai va givei oso to
divatov me sql kodika.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από ThyClub » 05 Ιαν 2006 10:07

Δεν ξέρω αν το PEAR::DB http://www.pear.php.net/package/DB σε βοηθήσει καθόλου με τα sequences του.

Βασικά εγώ είχα καταλάβει εντελώς άλλο πράγμα :D

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από Rapid-eraser » 05 Ιαν 2006 10:41

Lipov blepovtas ksava to paketo tou pear mou ir8e mia idea !!!

Avti ev gevi va pervaw to id tou row va pervaw to rank tou kai va paikso me to limit meta.
Dev kserw bebea av eivai poli bulletproof lisi
giati afto to stixio eivai metablito prosti8ovte/tropopiouvte oi eggrafes kai dev exeis
simio avaforas.

Dld mia eggrafi pou exei rank 45 twra
mporei abrio va exei rank 87 meta giati mpikav
kapies eggrafes evdiamesa, me apotelesma
va miv mporw va doso bookmarks etsi...
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από cherouvim » 05 Ιαν 2006 11:39

Mporeis na ftiakseis alla 2 fields sto table afto pou na dihnoun to next kai previous tou current row. Etsi tha ylopoihseis ena double linked list. Fysika i diadikasia insert, update kai delete tha hriazete parapano queries.

Des ton tropo edo http://en.wikipedia.org/wiki/Double_linked_list

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από dva_dev » 05 Ιαν 2006 13:33

Γιατί δεν προσπαθείς αφού μπορείς να πάρεις το timestamp του id που γνωρίζεις να κάνεις 2 select ακόμα ώστε να πάρεις και τα άλλα 2 ids που θέλεις (το προηγούμενο και το επόμενο αυτού που έχεις).

Δες ένα query (σε access) που φέρνει τα 2 ids - προηγούμενο, επόμενο - αυτού που δίνεις εσύ στην παράμετρο [x]. Θέλει τροποποίηση ώστε να παίζει με το συντακτικό της mysql (άλλαξε το TOP 1 σε αυτό που υποστηρίζει, νομίζω είναι LIMIT 1)

Κώδικας: Επιλογή όλων

SELECT ID FROM
(
   SELECT * FROM (
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE timestamp < &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;
    ORDER BY timestamp DESC&#41; V1
UNION
    SELECT * FROM &#40;
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE timestamp > &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;
    ORDER BY myTable.timestamp ASC
&#41; V2
&#41;
ORDER by timestamp ASC
Να ρωτήσω κάτι αν επιτρέπεται, τι είναι αυτό που προσπαθείς να υλοποιήσεις με αυτό τον τρόπο, (γιατί δεν έχω καταλάβει ποιό είναι το πρόβλημα);

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από dva_dev » 05 Ιαν 2006 13:46

Οπως ανέφερα και πρίν είναι προτιμότερο να γίνουν δύο ξεχωριστά queries παρά ένα για να πιάσεις την περίπτωση που βρίσκεσαι στην πρώτη ή στην τελευταία εγγραφή - οπότε δεν υπάρχει προηγούμενο/επόμενο id αντίστοιχα.

Υπάρχει και η άλλη λύση να φέρεις ένα ακόμα πεδίο με σταθερή τιμή: πχ -1 για το προηγούμενο και 1 για το επόμενο id ώστε αν το κάνεις με ένα query να γνωρίζεις η κάθε εγγραφή τι αντιπροσωπέυει (αν υπάρχουν 2 εγγραφές ούτως ή άλλως δεν έχεις πρόβλημα, αλλά αν έχεις μία εγγραφή να ξέρεις αν αφορά το προηγούμενο id ή το επόμενο).

πχ.

Κώδικας: Επιλογή όλων

SELECT id,idtype FROM
&#40;
SELECT *, "ΠΡΟΗΓΟΥΜΕΝΟ" as idType FROM &#40;
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE timestamp < &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;
    ORDER BY timestamp DESC&#41; V1
UNION
SELECT *, "ΕΠΟΜΕΝΟ" as idType FROM &#40;
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE timestamp > &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;
    ORDER BY myTable.timestamp ASC
&#41; V2
&#41;
ORDER by timestamp ASC
Οπότε ο πίνακας σου αν έχει τα data
id timestamp
1 12124566
74 12124570
15 12124576
30 12124589
2 12124590
100 12124599

Και δώσεις σαν παράμετρο το 2 θα πάρεις:
id idtype
30 ΠΡΟΗΓΟΥΜΕΝΟ
100 ΕΠΟΜΕΝΟ

Αν δώσεις σαν παράμετρο το 1 θα πάρεις:
id idtype
74 ΕΠΟΜΕΝΟ

και αν δώσεις σαν παράμετρο το 100 θα πάρεις:
id idtype
2 ΠΡΟΗΓΟΥΜΕΝΟ

Ελπίζω να βοήθησα.

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από Rapid-eraser » 05 Ιαν 2006 17:59

Gia to epomevo kai proigoumevo dev me evdiaferei posa queries 8a kavw dev eivai avagki va evo8ouv ta apotemesmata mazi dev sivtrexei kapoios logos.
Apla to sql statment psaxvw nte gia tnv mia nte gia tnv alli periptosi

Episis iparxei allo eva problima oti polles fores iparxouv rows pou exouv taftosimo timestamp opote etsi dev mporeis va ksexoriseis ta rows me basi to
timestamp apoklistika n to id apoklistika.

Thanks gia to query 8a to diabaso prosektika.

Episis stnv 4.0.x mysql dev iparxouv subqueries alla dev eivai problima afto.

Cherouvim thanks gia to double linked list tip 8a to diabaso av kai dev eivai poli efikto stnv parousa fasi giati idi iparxouv arketes eggrafes opote dev eivai poli efkolo va evimero8ouv sosta. ektos aftou allazouv poli grigora ta timestamps kai malov perisotero overhead 8a dimiorgisei apra 8a epilisei ... pavtos 8a to diabaso giati apo oti eida proxira
eivai foundamental arxi opote olo kai kati parapavo 8a perigrafei.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από dva_dev » 05 Ιαν 2006 18:31

Αν έχουν το ίδιο timestamp (πχ. 4 εγγραφές έχουν το ίδιο) τότε πως γίνεται το ordering?

Με βάση το timestamp ASC, id ASC μπορεί να αλλάξει το query σε κάτι τέτοιο.

Κώδικας: Επιλογή όλων

SELECT id,idtype FROM
&#40;
SELECT *, "ΠΡΟΗΓΟΥΜΕΝΟ" as idType FROM &#40;
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE &#40;timestamp < &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41;
    OR  &#40; &#40;timestamp = &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41; AND id<&#91;x&#93;&#41;
    ORDER BY timestamp DESC, id DESC&#41; V1
UNION
SELECT *, "ΕΠΟΜΕΝΟ" as idType FROM &#40;
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE &#40;timestamp > &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41;
    OR  &#40; &#40;timestamp = &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41; AND id>&#91;x&#93;&#41;
    ORDER BY myTable.timestamp ASC, id ASC
&#41; V2
&#41;
ORDER by timestamp ASC
Πρόσθεσα βασικά την περίπτωση που έχεις το ίδιο timestamp οπότε κάνει τη σύγκριση με βάση το id

Κώδικας: Επιλογή όλων

OR  &#40; &#40;timestamp = &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41; AND id<&#91;x&#93;&#41;
...
OR  &#40; &#40;timestamp = &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41; AND id>&#91;x&#93;&#41;
Αφού η mysql 4 δεν υποστηρίζει subqueries πρέπει να τρέξεις το
SELECT timestamp FROM myTable WHERE id=[x]
ξεχωριστά και στη θέση του να βάλεις την τιμή που σου επιστρέφει.
Τελευταία επεξεργασία από το μέλος dva_dev την 05 Ιαν 2006 18:57, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από Rapid-eraser » 05 Ιαν 2006 18:36

givete se proto ba8mo me basi to timestamp ASC
kai se deftero ba8mo me to id se DESC domi.

Κώδικας: Επιλογή όλων

ORDER BY `timestamp` ASC , `id` DESC
Kai epidi to id eivai autoincrement dev iparxei periptosi va simpiptouv
dio eggrafes me idio id opote avagkastila livete ekei to ordering
me akribia.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ebresi epomevis eggrafis me xrovologiko ordering

Δημοσίευση από dva_dev » 05 Ιαν 2006 19:03

Αφού έχεις το id DESC τότε πρέπει να γίνει

Κώδικας: Επιλογή όλων

SELECT id,idtype FROM
&#40;
SELECT *, "ΠΡΟΗΓΟΥΜΕΝΟ" as idType FROM &#40;
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE &#40;timestamp < &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41;
    OR  &#40; &#40;timestamp = &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41; AND id>&#91;x&#93;&#41;
    ORDER BY timestamp DESC, id ASC&#41; V1
UNION
SELECT *, "ΕΠΟΜΕΝΟ" as idType FROM &#40;
    SELECT TOP 1 id, timestamp FROM myTable
    WHERE &#40;timestamp > &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41;
    OR  &#40; &#40;timestamp = &#40;SELECT timestamp FROM myTable WHERE id=&#91;x&#93;&#41;&#41; AND id<&#91;x&#93;&#41;
    ORDER BY timestamp ASC, id DESC&#41; V2
&#41;
ORDER by timestamp ASC

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες