Home Forums Informacija Puslapis perkeltas

Viewing 20 posts - 21 through 40 (of 47 total)
  • Author
    Posts
  • #11826
    Šarūnas
    Keymaster

    Truputį ne mano sritis, tai užklimpau su duombaze. Yra čia gal MySQL liūtų?

    #11830
    Tyro
    Participant

    Nesakysiu jog liutas ar pan, bet gal galiu padeti kuo nors? Su MySQL draugauju.

    #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. :)

    #11832
    serafanas
    Participant

    O 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ą.

    #11833
    Šarūnas
    Keymaster

    Na 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.

    #11834
    Tyro
    Participant

    Apkrauti 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ę.

    #11836
    Ned
    Participant

    Pabandyk toki varianta
    http://pastebin.com/Fa1r8CEm
    sintaksės netikrinau, bet turi veikt

    #11838
    Ned
    Participant

    oi, 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’

    #11839
    Šarūnas
    Keymaster

    Su š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..

    #11840
    Ned
    Participant

    Sunku redaguot notepadu. :) Lengviau butų prisijungus prie DB. Jei jau niekaip neišeis sakyk, prisijungsim kaip nors ir sutvarkysim.

    #11841
    Nerijus
    Participant

    na 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,12

    #11847
    Tyro
    Participant

    Imetu savo versija, manau turetu veikti.
    linkas

    Kelios 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.

    #11851
    Šarūnas
    Keymaster

    Pasibandž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.

    #11853
    Nerijus
    Participant

    o ar ne geriau vietoj vienos užklausos daryt 2 – pirmą – blogo postai , blogo komentarai , antrą -forumo temos ir jų atsakymai .

    #11854
    Šarūnas
    Keymaster

    Paruošiau testinę duombazę. Prisijungimas:
    https://kirtiklis.serveriai.lt/MyAdmin/
    user: emonlt_test
    pass: Emotion123

    Tai 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.

    #11872
    Ned
    Participant
    #11879
    Šarūnas
    Keymaster

    Dė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. :)

    #11883
    Ned
    Participant

    Truputi pakoregavau. Patikrink. Nors jau vėlu, makaulė nebdirba.
    http://pastebin.com/ruvRKKwA

    • This reply was modified 9 years, 3 months ago by Ned.
    #11885
    sopkis
    Participant

    Toks 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?

    #11887
    Šarūnas
    Keymaster

    Ač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. :)

Viewing 20 posts - 21 through 40 (of 47 total)
  • You must be logged in to reply to this topic.