Home › Forums › Informacija › Puslapis perkeltas
- This topic has 46 replies, 10 voices, and was last updated 8 years, 10 months ago by
agniusm.
-
AuthorPosts
-
2015/10/19 at 12:17 #11826
Šarūnas
KeymasterTruputį ne mano sritis, tai užklimpau su duombaze. Yra čia gal MySQL liūtų?
2015/10/19 at 15:00 #11830Tyro
ParticipantNesakysiu jog liutas ar pan, bet gal galiu padeti kuo nors? Su MySQL draugauju.
2015/10/19 at 15:35 #11831Šarūnas
KeymasterČia yra užklausa, kurią iki šiol naudojo mano rašytas “recent activity” pluginas:
http://pastebin.com/8rg5XB1H
Užklausos esmė, kad ji atrenka 12 naujausių temų, o tam atrenka visus naujausius forumo ir blogo postus ir komentarus. Tada viską sudėlioja pagal laiką ir sugrūpuoja į temas. Mintis yra temą sąraše rodyti tik vieną kartą, kad ir kiek diskusijų joje vyktų.
Gal ne pati gražiausia implementacija ir veikė lėtokai, bet veikė… Problema, kad ORDER BY negali eiti prieš GROUP, tai rezultatas – pirma papuolus eilutė iš grupės. Iki perkėlimo į naują serverį buvo senesnė MySQL versija, kuri kažkodėl veikė kiek kitaip.
Jei pašalinu eilutę su GROUP BY, viskas veikia gražiai, tik aišku gaunu pavienius komentarus, nesugrūpuotus į temas.
Dabar man reikia šią užklausą modifikuoti taip, kaip GROUP grąžintų tas eilutes, kuriose post_id yra didžiausias. Radau visokių pavyzdžių su max(post_id) ir panašiai, bet mano atveju užklausos eina iš kelių skirtingų lentelių ir rezultate nesigauna nieko. Bandžiau net visokias laikinas lenteles kurt. :)
Jei būtų kokių idėjų, o jei net ir kažką gatavo puregztum.. būtų šaunu. :)2015/10/19 at 17:23 #11832serafanas
ParticipantO tavęs nedomina išsiimti 12 naujausių temų ir likusį darbą padaryti su PHP? :) Nes tiek JOIN’ų, GROUP BY ir pan tikrai bus lėčiau laiko prasme nei PHP pratikrint masyvą.
2015/10/19 at 17:50 #11833Šarūnas
KeymasterNa matai, 12 naujausių temų nebūtinai reiškia 12 šviežiausių diskusijų :) T.y. pavyzdžiui, gali būti šviežiai sukurtos 5 naujos temos, bet visos diskusijos vyks senose… Arba kažkas parašys į metų senumo temą ir jos iš vis nepamatysime sąraše. Imt 12 naujausių pranešimų irgi neišeina, nes visi jie gali būti vienoje temoje…
Galvojau įvairius variantus, bet sunkiai sekėsi sprendimą rast, dėl to ir gavosi toks gargaras. Šiaip lėtokai veikia ir tikrai yra vietos optimizavimui, bet dar nėra taip blogai, kad kiltų problemų. Jei puslapio lankomumas pakiltų 1000 kartų, tada gal ir būtų bėdos. O kol kas – neverta gaišti laiko.2015/10/19 at 18:37 #11834Tyro
ParticipantApkrauti SQL labai dažnai yra paprasšiau nei PHP, nes jis dirba efektyviau ir gauni tai ko nori, tik kartais ne iš karto pavyksta atlikti tai ko nori. Užklausa visai normali, gal tik reikia aptvarkyti index’us jeigu trūksta greičio. Vėliau pamėginsiu pasiųlyti savo variantą. Esu daręs panašių užklausų, dažniausia prisireikia susikurti tempinę sql lentelę.
2015/10/19 at 18:48 #11836Ned
ParticipantPabandyk toki varianta
http://pastebin.com/Fa1r8CEm
sintaksės netikrinau, bet turi veikt2015/10/19 at 20:00 #11838Ned
Participantoi, klaida
pakeis eilute ‘max(post_date) as max_post_date’
i
‘max(if(com.comment_approved = ‘1’, unix_timestamp(com.comment_date), unix_timestamp(p.post_date))) as max_post_date’2015/10/19 at 20:06 #11839Šarūnas
KeymasterSu šituo variantu visos 12 temų tarpusavyje išsortinamos kaip ir gerai, bet eilučių turinys vis tiek neatitinka realybės… Kiek aš mačiau pavyzdžius, tai prieš grupavimą tiesiog bando grąžinti visas vertes atitinkančias eilutės, kurioje yra max vertė. Tada jau yra garantija, kad grupuojant duomenys bus teisingi, net jeigu išsirinks randominę eilutę. Arba gal dar kažkaip galima..
2015/10/19 at 21:59 #11840Ned
ParticipantSunku redaguot notepadu. :) Lengviau butų prisijungus prie DB. Jei jau niekaip neišeis sakyk, prisijungsim kaip nors ir sutvarkysim.
2015/10/19 at 22:30 #11841Nerijus
Participantna jei eilutes kartojasi tai reiktu “select distinct” . ps 3 lentenlės ir 4 joinai kažkas įdomaus . beje kokios sql versijos ?
Ned “order by max(kazkas)” kaip ir nelabai turi prasmės .
nesu tikras kad gerai bet gal veiks
select *.coments , *.post as m where coments.postid= post.id left join on m.userid=users.id group by post.parent ORDER BY post_date DESC
LIMIT 0,122015/10/20 at 00:26 #11847Tyro
ParticipantImetu savo versija, manau turetu veikti.
linkasKelios lenteles jungiames daugiau nei 1 karta nes kartais taip reikia :) Siuo atveju manau tai del to nes vienais atvejais gali mums pargrazinti nauja tema, o kitais – atsakymas i sia ar kita tema. Ir atsakymas neturi temos pavadinimo (reikia prisijungti pacia tema jog gauti pavadinima kuri rodysim vietoje teksto kaip kad ‘atsakymas i kazkokia tema’). Na strukturos nesigilinau per daug, bet pasirode jog yra kaip aprasiau.
2015/10/20 at 08:13 #11851Šarūnas
KeymasterPasibandžiau. Iš esmės tai neveikia. :)
Pirmas dalykas, ORDER BY prieš GROUP nieko nekeičia, nes GROUP neatsižvelgia į duomenų eiliškumą. Tai rezultate man rodo seniausių temų pirmus atsakymus, o ne naujausių paskutinius (tiesiog taip gaunasi, kai randomu parenka duomenis (na gal ne randomu, o paeiliui iš DB)). Po GROUP BY įdėjus ORDER BY, temas rodo naujausias, bet atsakymus seniausius. :)Dėl sudėtingumo Tyro pastebėjimas yra teisingas. Turime 4 tipų pranešimus: blogo postai, blogo komentarai, forumo temos, forumo temų atsakymai. Visi šie duomenys yra pateikiami šiek tiek skirtingai ir išsibarstę per dvi lenteles. Taipogi dar reikia gauti userių informaciją: vardą, nuorodą į profilį. Tai ir gaunasi, kad reikia joinint 3 lenteles ir tada jose kapstytis. Tenka pripažinti, kad gana sudėtinga užklausa, gal dėl to ir nėra tokio paruošto plugino wordpressui…
Su SELECT DISTINCT manau irgi galima kažkaip, su užklausa užklausoje ar net trigubo lygio užklausa, bet įvertinus bendrą sudėtingumą ne taip paprasta pasidaro. :)
Gal paruošiu kokią demo duombazę su phpMyAdmin prieiga, bus paprasčiau… Tik pirma reikia apdoroti duomenis, kad neliktų userių privačios informacijos.2015/10/20 at 09:03 #11853Nerijus
Participanto ar ne geriau vietoj vienos užklausos daryt 2 – pirmą – blogo postai , blogo komentarai , antrą -forumo temos ir jų atsakymai .
2015/10/20 at 09:05 #11854Šarūnas
KeymasterParuošiau testinę duombazę. Prisijungimas:
https://kirtiklis.serveriai.lt/MyAdmin/
user: emonlt_test
pass: Emotion123Tai yra naujausia duomenų kopija: tik reikalingos lentelės, userių asmeniniai duomenys ir seni, testui nebūtini pranešimai yra pašalinti.
Redagavimo teisių nėra, tai galima drąsiai bandyti visokius dalykus.Kas nedirbęs su phpMyAdmin: užklausą rašyti į laukelį Query.
2015/10/20 at 16:48 #11872Ned
ParticipantTestuojam
http://pastebin.com/1XS4EEMS2015/10/20 at 20:08 #11879Šarūnas
KeymasterDėkui, jau kažkas į tą pusę, forumo žinutes lyg ir normaliai rodo. Tačiau blogai veikia blogo komentarai, pvz.: http://e-motion.lt/2015/05/05/elektromobiliu-lenktynes-vilnius-palanga/comment-page-1/#comment-2751
Tema atsiranda activity viršuje, tačiau komentaras visai neaišku iš kur paimtas, gal iš kitos lentelės su tuo pačiu ID. :)2015/10/20 at 22:23 #11883Ned
ParticipantTruputi pakoregavau. Patikrink. Nors jau vėlu, makaulė nebdirba.
http://pastebin.com/ruvRKKwA-
This reply was modified 9 years, 4 months ago by
Ned.
2015/10/20 at 23:09 #11885sopkis
ParticipantToks klausimas. Kadangi kompiuteriu retai naudojuosi, tai forumą naršau telefonu. Seniau naudojau Android Opera mini, bet teko atsinaujinti, nes senesnė versija pradėjo smiginėti be priežasties. Tik tiek kad su dabartine naršykle užkrauna mobilią versiją, ir tas aktualus, bet nelemtas recent activity atsirado labai apačioje, nors seniau buvo aiškiai matomas puslapio viršuje po dešine. Yra kokie paprasti veiksmai, kad telefone matyti tokį patį vaizdą kaip ir kompiuterio ekrane?
2015/10/21 at 08:05 #11887Šarūnas
KeymasterAčiū Ned, paleidau. Rezultatas geresnis, tačiau blogo komentaruose rodo nulinį atsakymų skaičių. :)
Sopki, čia yra “adaptive” templeitas, kuris prisitaiko prie mažo ekrano ir dešinį stulpelį numeta apačion. Jei nori “desktopinio” varianto, naršyklės nustatymuose pasirink “request desktop site” ar kažkaip panašiai, visi savaip vadina. :) -
This reply was modified 9 years, 4 months ago by
-
AuthorPosts
- You must be logged in to reply to this topic.