Pereiti prie turinio

Mysql join 4 lenteles


Rekomenduojami pranešimai

Sveiki, gal kas padetu normalu join'a parasyti 4 lentelem. Prie useriu lenteles reikia prijungti jiem priklausancius customerius, o tada paliai userius ir customerius prijungti profilius(tam naudoju relations lentele) ir is visu lenteliu paimtu skaiciu gauti sudalinta suma.

 

 

2 Thomas White 2.56 180.00 461.89 0.00 0.00 0.00 antras komentaras

3 Doina Slaivici 5.87 161.17 946.88 0.00 0.00 vienas komentaras

 

Dabartinis rezultas, kaip ir viskas gerai butu, bet profiliai turi komentarus kai gaunu suma ir grupuoju, kad nesikartotu vardai, o tik konkreciam vartotojui jo profiliu sumas rodytu, nebematau visu komentaru rodo tik po viena, o man reikia, kad vartotojo profiliu komentarus jam priklausancius rodytu visus.

 

 

Kadangi niekada nesupratau tu joinu normaliai sioke toke pornuka dar pac pasirasiau, dabar tik tie komentarai..

 

SELECT *, users.id AS uid, users.sum_per_hour AS usum_per_hour,
                                       SUM(customers.sum / 4.33 / customers.days_per_week * profiles.days) AS total_sum

                                       FROM users, relations, customers, profiles WHERE users.id = relations.uid
                                        AND customers.id = relations.cid
                                        AND profiles.uid = relations.uid
                                        AND profiles.cid = relations.cid GROUP BY users.id

 

Pridedu lenteles: post-91230-0-70102800-1410183444_thumb.jpg

Redagavo ParaMynde
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nežinau ar pagalbos tau dar reikia, bet pirmas klausimas būtų, ar gali koreguoti savo duomenų bazės struktūra, nes įtariu, kad ją galima suprastinti (atsisakyti Relations lentos).

 

O antras klausimas - kokio tu rezultato norėtumei? Kažko tokio:

2 Thomas White 2.56 180.00 461.89 0.00 0.00 0.00 antras komentaras

3 Doina Slaivici 5.87 161.17 946.88 0.00 0.00 vienas komentaras, trecias komentaras

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Yra GROUP_CONCAT agreguojanti funkcija, kuri sujungia keletą stringų į vieną, kai darai GROUP BY.

 

Kitas variantas - pirmos užklausos metu praleidi komentarus, o susirenki tik vartotojų duomenis. Tada vėliau kiekvienam vartotojui užklausi jo komentarus. Šis variantas geresnis tuo, kad lengviau manipuliuoti pačiais komentarais, tačiau atsiranda papildomų užklausų.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nežinau ar pagalbos tau dar reikia, bet pirmas klausimas būtų, ar gali koreguoti savo duomenų bazės struktūra, nes įtariu, kad ją galima suprastinti (atsisakyti Relations lentos).

 

O antras klausimas - kokio tu rezultato norėtumei? Kažko tokio:

2 Thomas White 2.56 180.00 461.89 0.00 0.00 0.00 antras komentaras

3 Doina Slaivici 5.87 161.17 946.88 0.00 0.00 vienas komentaras, trecias komentaras

 

Jo vis dar pagalbos reikia :) O del relations atsisakymo net nezinau gal ir gerai butu tas suprastinimas dabar aplamai cia mano suprojektuota kreivai ta duom. baze, bet esme koke, kad useriui yra pirmiausiai priskiremi objektai(customers) prie kuriu jis dirbs ir profiliai dar iskarto neegzistuoja kol useris pac neuzpildo veliau, tad nezinau gal atvirkstinis variantas butu galimas is profiliu ismetus uid, cid, kad jie nesidubliuotu ir profilio id dametus prie relations.

 

O del rezultato tai taip butent tokio ir reikia kaip, kad pateikei, visu komentaru tam useriui priklausanciu.

 

Imeciau cia: http://sqlfiddle.com/#!2/b26992/1 perdariau ant left join, kad biski tvarkingiau atrodytu ir cia butent be relations lenteles yra.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Visu pirma, tai relations table neturetu turet 'id'. Visu antra, gal galetum surasyt tiksliai kuriu duomenu is kuriu lenteliu reikia?

Duomenys yra reikalingi tokie,

Customers table: days_per_week, sum, sum_per_hour.

Profiles table: days, hours_per_time, comment.

Users table: id, name_surname.

Redagavo ParaMynde
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai dėl struktūros pertvarkymo:

Šiaip žiūriu selectas pas tave geras kai relations lentą išmetei, bet gal vertėtų Customers lentą papildyt user id (išorinis raktas), kad kuriant galėtum nurodyti kokiam vartotojui priskirti.

O dėl profiles lentos keli variantai, tarp kurių didelio skirtumo nėra:

• palikti taip kaip yra (toks ryšys(cid ir uid toj pačioj lentoj), man asmeniškai, nelabai patinka, bet nėra blogas ir palengvins tau select'us)

• išmesti user id (tik tuo atveju, jeigu customers lentą papildysi ir jeigu profiliai kuriami tik egzistuojantiems customers, t. y. negali būti situacijos, kad profilis nėra priskirtas prie kažkokio customer'io) - tokiu atveju jeigu norėsi select'inti userį ir jo profilius, vistiek turėsi juos surišinėti per customers lentą tai nežinau ar verta perdarinėt.

 

Nu o jeigu tiesiog patvarkyt tavo nurodyta selectą, tai darbas ten menkas, kaip kolega sakė, group_concat naudot ir vsio.

SELECT
     *,
     users.id AS uid,
     users.sum_per_hour AS usum_per_hour,
     profiles.comment AS pcomment,
     group_concat(profiles.comment),    
     SUM(
       customers.SUM / 4.33 / customers.days_per_week * profiles.days
     ) AS total_sum
   FROM
     profiles
   LEFT JOIN users
     ON profiles.uid = users.id
   LEFT JOIN customers
     ON profiles.cid = customers.id
   GROUP BY users.id

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai dėl struktūros pertvarkymo:

Šiaip žiūriu selectas pas tave geras kai relations lentą išmetei, bet gal vertėtų Customers lentą papildyt user id (išorinis raktas), kad kuriant galėtum nurodyti kokiam vartotojui priskirti.

O dėl profiles lentos keli variantai, tarp kurių didelio skirtumo nėra:

• palikti taip kaip yra (toks ryšys(cid ir uid toj pačioj lentoj), man asmeniškai, nelabai patinka, bet nėra blogas ir palengvins tau select'us)

• išmesti user id (tik tuo atveju, jeigu customers lentą papildysi ir jeigu profiliai kuriami tik egzistuojantiems customers, t. y. negali būti situacijos, kad profilis nėra priskirtas prie kažkokio customer'io) - tokiu atveju jeigu norėsi select'inti userį ir jo profilius, vistiek turėsi juos surišinėti per customers lentą tai nežinau ar verta perdarinėt.

 

Nu o jeigu tiesiog patvarkyt tavo nurodyta selectą, tai darbas ten menkas, kaip kolega sakė, group_concat naudot ir vsio.

SELECT
     *,
     users.id AS uid,
     users.sum_per_hour AS usum_per_hour,
     profiles.comment AS pcomment,
     group_concat(profiles.comment),    
     SUM(
       customers.SUM / 4.33 / customers.days_per_week * profiles.days
     ) AS total_sum
   FROM
     profiles
   LEFT JOIN users
     ON profiles.uid = users.id
   LEFT JOIN customers
     ON profiles.cid = customers.id
   GROUP BY users.id

Vo dekui butent to ir reikejo rezultate, o jaigu man dabar reikia dar is customers prideti title rezultate salia komentaro, kad pvz butu:

 

2 Thomas White 2.56 180.00 461.89 0.00 0.00 0.00 Akropolis - antras komentaras

3 Doina Slaivici 5.87 161.17 946.88 0.00 0.00 Akropolis - vienas komentaras, bruklinas - trecias komentaras

 

bandziau tapati group_concat() panaudoti, bet titlus tiesiog gale komentaru padrikai ismeto.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nu matai, jeigu nori kažko vienam lauke tai reik ir į tą patį elementą "sugrūst"

SELECT
     *,
     users.id AS uid,
     users.sum_per_hour AS usum_per_hour,
     profiles.comment AS pcomment,
     group_concat(customers.title, " - ", profiles.comment),    
     SUM(
       customers.SUM / 4.33 / customers.days_per_week * profiles.days
     ) AS total_sum
   FROM
     profiles
   LEFT JOIN users
     ON profiles.uid = users.id
   LEFT JOIN customers
     ON profiles.cid = customers.id
   GROUP BY users.id

Redagavo GedasGG
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nu matai, jeigu nori kažko vienam lauke tai reik ir į tą patį elementą "sugrūst"

SELECT
     *,
     users.id AS uid,
     users.sum_per_hour AS usum_per_hour,
     profiles.comment AS pcomment,
     group_concat(customers.title, " - ", profiles.comment),    
     SUM(
       customers.SUM / 4.33 / customers.days_per_week * profiles.days
     ) AS total_sum
   FROM
     profiles
   LEFT JOIN users
     ON profiles.uid = users.id
   LEFT JOIN customers
     ON profiles.cid = customers.id
   GROUP BY users.id

Nu blin kaip as cia nesugalvojau taip paprastai, geda :)) Dekui tau dar karta :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...