pilots Posted May 24, 2008 Report Share Posted May 24, 2008 Datubāzē glabājas lietotāju pievienoto foto ieraksti. foto_db piemērs. id | userid | filename 1 | aaa | ... 2 | aaa | ... 3 | bbb | ... 4 | aaa | ... 5 | bbb | ... 6 | bbb | ... 7 | ccc | ... 8 | bbb | ... 9 | aaa | ... Lietotājs "aaa" ir pievienojis 4 attēlus. Tie ir ar `id` => 1(1), 2(2), 4(3), 9(4) Lietotājs "bbb" ir pievienojis 4 attēlus. Tie ir ar `id` => 3(1), 5(2), 6(3), 8(4) Lietotājs "ccc" ir pievienojis 1 attēlu. Tas ir ar `id` => 7(1) *Iekavās norādīts, kurš šis attēls pēc kārtas ir, ko katrs lietotājs pievienojis. Galvenajā lapā tiek izvadīti nejauši atlasīti 3 pievienotie attēli ar saiti uz tiem. SELECT * FROM foto_db ORDER BY RAND() LIMIT 3 Ir nepieciešams, lai galarezultātā izvadot šos attēlus, tiem klāt varētu izvadīt arī skaitli - kurš pēc kārtas tas attēls ir lietotāja albūmā. Vadoties pēc piemēra datubāzes, vēlamais random rezultāts būtu: User:bbb img_id:8 <img src="..."> Nr4<br /> User:bbb img_id:4 <img src="..."> Nr3<br /> User:ccc img_id:7 <img src="..."> Nr1<br /> Kā gan šo kārtas skaitli uzzināt? Link to comment Share on other sites More sharing options...
Kavacky Posted May 24, 2008 Report Share Posted May 24, 2008 a) Saglabā bāzē nr. Link to comment Share on other sites More sharing options...
pilots Posted May 24, 2008 Author Report Share Posted May 24, 2008 (edited) Ehh. Stundu domāju kā izklāstīt problēmu, un izskatās ka arī risinājums tik viegli nerodas. :( Redz, saglabājot bāzē numuru, šaubos, ka tas ko atvieglos. Jo, piemēram, ja lietotājs `aaa` izdzēš attēlu ar id `2` tad iztrūkst viņa galerijā attēls ar kārtas numuru 2. (šķiet vajadzēja precizēt, ka jānoskaidro kārtas numurs pievienotajam attēlam, ņemot vērā, ka ja izdzēš nr2, tad visi nākamie pielāgojas, veidojot nepārtrauktu secību.) Paldies protams par mēģinājumu palīdzēt, un kādam varbūt ir vēl risinājumi? Edited May 24, 2008 by pilots Link to comment Share on other sites More sharing options...
marrtins Posted May 24, 2008 Report Share Posted May 24, 2008 (edited) Pasākums ir visnotaļ ķēpīgs, bet nu mēģināšu pastāstīt, kā to daru es. Došu kodu, kā lietotājam ievietot bildi KONKRĒTĀ pozīcijā. Ja ir vajadzīgs bildi ievietot tikai bilžu saraksta beigās, tad biki pielabo INSERT daļu. Tātad, ieviešam jaunu lauku - foto_pos(integer). Kas mums ir vajadzīs? Pirmkārt, pamainīt kārtas numuru pie izmaiņām datubāzē - INSERT, UPDATE, DELETE. Pieņemu, ka $data[] masīvā glabājas dati, kas ir jāsaglabā datubāzē: $data['userid'] - lietotājs $data['filename'] - faila nosaukums $data['foto_pos'] - pozīcija, kādā šo failu iestādīt Pozīcija sākas ar 1 un beidzas ar foto_skaitu konkrētam lietotājam. # INSERT .... šeit kods, kas pievieno jaunu bildi # pēc veiksmīga INSERTA, pielabojam pozīcijas pārējām bidēm. # ja bilde vienkārši tiek pievienota bilžu saraksta galā, tad šo daļu var izlaist, # protams, pirms INSERTA tam dabūjot MAX(foto_pos) WHERE userid = '$data[userid]' # dabūjam jauno id $last_id = last_insert_id(); # ideja - visām bildēm, kam pozīcija ir lielāka nekā jaunajai, pamainīt pozīciju + 1 $sql = "UPDATE foto_db SET ". "foto_pos = foto_pos + 1 ". "WHERE ". "foto_pos >= $data[foto_pos] AND ". "id != $last_id AND ". "userid = $data[userid]"; $db->execute($sql); Visķēpīgākā daļa - UPDEITS # UPDATE # dabūjam vecāieraksta datus $data_old = get_item($data['id']); .... šeit kods, kas apdeito jaunu bildi # pēc veiksmīga UPDATE, pielabojam pozīcijas pārējām bidēm. $sql = ''; # ja mainās lietotājs (šo daļu var izlaist, ja lietotājs nekad nemainīsies) if($data['userid'] != $data_old['userid']) { # vispirms pielabojam pozīcijas vecajam lietotājam $sql = "UPDATE foto_db SET ". "foto_pos = foto_pos - 1 ". "WHERE ". "foto_pos > $data_old[foto_pos] AND ". "userid = $data_old[userid]"; $db->execute($sql); # šitā daļa principā tādi pati kā pie foto INSERTA $sql = "UPDATE foto_db SET ". "foto_pos = foto_pos + 1 ". "WHERE ". "foto_pos >= $data[foto_pos] AND ". "id != $data[id] AND ". "userid = $data[userid]"; } else { # šeit sākas kods, ja lietotājs NAV mainīts # ja jaunā pozīcija ir lielāka par veco if($data['foto_pos'] > $data_old['foto_pos']) $sql = "UPDATE foto_db SET ". "foto_pos = foto_pos - 1 ". "WHERE ". "foto_pos >= $data_old[foto_pos] AND ". "foto_pos <= $data[foto_pos] AND ". "id != $data[id] AND ". "userid = $data_old[userid]"; # ja jaunā pozīcija ir mazāka par veco elseif($data['foto_pos'] < $data_old['foto_pos']) $sql = "UPDATE foto_db SET ". "foto_pos = foto_pos + 1 ". "WHERE ". "foto_pos <= $data_old[foto_pos] AND ". "foto_pos >= $data[foto_pos] AND ". "id != $data[id] AND ". "userid = $data_old[userid]"; } # izdaram izmaiņas if($sql) $db->execute($sql); Pie ieraksta izdzēšanas viss atkal ir vienkārši - samazinam foto_pos par 1, visiem ierakstiem, kas bija ar lielāko pozīciju, kā dzēšamajam ierakstam # DELETE # dabūjam vecā ieraksta datus $data = get_item($data['id']); .... šeit kods, kas izdēš bildi $sql = "UPDATE foto_db SET ". "foto_pos = foto_pos - 1 ". "WHERE ". "foto_pos > $data[foto_pos] AND ". "userid = $data[userid]"; $db->execute($sql); Ja ir pieejams MySQL ar trigeriem, iesaku šo kodu pārnest uz trigeriem - būs vienalga ar kādu clientu mainīt pozīcijas. Edited May 24, 2008 by marrtins Link to comment Share on other sites More sharing options...
nemec Posted May 24, 2008 Report Share Posted May 24, 2008 es tā saprotu, ka kārtas numuru nosaka sortēšana pēc `id` SELECT p.`id`, p.`userid`, (SELECT COUNT(p2.`id`) FROM `photo` AS p2 WHERE p2.`userid`=p.`userid` AND p2.`id`<=p.`id` ORDER BY p2.`id` ASC ) AS position FROM `photo` AS p ORDER BY RAND() LIMIT 3 Link to comment Share on other sites More sharing options...
pilots Posted May 24, 2008 Author Report Share Posted May 24, 2008 marrtins, tavs risinājums liktu izmantot papildus lauku, kur glabāt kārtas nr, ko arī varētu darīt, tomēr nemec variants gandrīzvai strādā. Ar nemec variantu ir gan bēda, lai arī kārtas numuru izvada, tomēr ačgārni (no otra gala skaitot). Ja ir 7 bildes un izvada bildi kura ir pirmā, tad kā kārtas numuru izvada 7, ja 6 - tad 2 .. Es mēģinu šobrīd izkost to subkveriju, bet varbūt kāds ātrāk pamana ko pamainīt kodā. Link to comment Share on other sites More sharing options...
marrtins Posted May 25, 2008 Report Share Posted May 25, 2008 Pamēģini pamainīt šos te: WHERE p2.`userid`=p.`userid` AND p2.`id`[b]>[/b]=p.`id` ORDER BY p2.`id` [b]DESC[/b] Skaties, ka izmantojot subkveriju tas normāli iebremzēs pie noteikta datu apjoma un/vai slodzītes. Link to comment Share on other sites More sharing options...
pilots Posted May 25, 2008 Author Report Share Posted May 25, 2008 Urā! WHERE p2.`userid`=p.`userid` AND p2.`id`<=p.`id` izmainīju uz: WHERE p2.`userid`=p.`userid` AND p2.`id`>=p.`id` Pieredze iepriekš nav bijusi ar subkverijiem, tādēļ nepārzinu kādas problēmas tas varētu sagādāt. Šeit manis uzdotajam jautājumam ir arī cits piegājiens (sarežģītāks), kuru nepieciešamības gadījumā izskatīšu. Attiecīgais projekts ir uz tīra entuazisma balstīts un bez finansēm, tādēļ šai problēmai patlaban vēlējos vieglāko risinājumu. Tencinu visus, kas dalījās ar padomiem un jo īpaši biedram - nemec. Link to comment Share on other sites More sharing options...
pilots Posted December 20, 2008 Author Report Share Posted December 20, 2008 Skaties, ka izmantojot subkveriju tas normāli iebremzēs pie noteikta datu apjoma un/vai slodzītes. ehh, prieki nebija ilgi. šis risinājums tiešām ir lēns un un aizkavē lapas ielādi. un ne slodze ne datu nav daudz.. Link to comment Share on other sites More sharing options...
Recommended Posts