Neodan wrote:

Na visu pirma reiktu ismokti normaliai klausimus uzdavineti. Visu antra reiktu netingeti pasigooglinti (UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;). Visu trecia reiktu netingeti pasimokinti ir manualus pasiskaityti (http://dev.mysql.com/doc/refman/5.0/en/update.html)

Tada kitaip pasakysiu kaip rašosi tai

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id if (a=1 or b=2)then c=true else c=false

niekas nesigauna man su mysql nes neina suprasti ten tų sudėtingų aiškinimų dokumentacijoje

žodžiu pagal dokumentaciją mysql niekas nesigauna ar kas galit man parodyti paprastą sintaksę ar pavydzį kaip turėtų atrodyti užklausa?
Noriu lentelėje ooo atnaujinti info stulpelyje aaa, kai lentelės goo stulpelis ggg yra lygus 'zubas' arba lygus 'rudas' jei taip tai goo.ggg yra lygus 0 jei ne 1

363

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:

Tai dabar pabandyk pagalvot, ką daro tavo SQL'as:
1) vidinė sub-užklausa atlieka duomenų atrinkimą ir suklijavimą, čia viskas gerai;
2) klausimas yra - kiek rezultatų (eilučių) gražina tavo ta užklausa - ar vieną ar daugiau, jeigu vieną, tai viskas gerai, nes tada 'SET kazkas = (1_reiksme)' veiks teisingai, bet jeigu gražina daugiau - bus problema;
3) kitas klausimas - tavo sub-užklausa gražina du stulpelius, kaip tu įsivaizduoji veikia SET operatorius UPDATE užklausoje, kaip tu nori vienam stulpeliui priskirti dviejų stulpelių reikšmes? (apie tai klaidos pranešimas ir yra);
4) žinok kažkas blogai pas tave su WHERE sąlyga, man kažkur trūksta lentelės "goo", kaip tu WHERE sąlygoje naudoji lenetlės "goo" duomenis, kai ta lentelė daugiau niekur kitur nefiguruoja?

Dėkui susitvarkiau, pasirodo kad vis dar neina man suprasti selecto nors jis man atrodo paprasčiausias. :)

364

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:

Visada jeigu rašai parašyk ir klaidos pranešimą.

Paskui išmok užklausas rašyti taip, kad jas būtų galima normaliai perskaityti:

UPDATE atsss
SET attachments = (
      SELECT files.reply_id,
         GROUP_CONCAT( CONCAT_WS( att_id , '#' , real_name , ',' ) )
      FROM files,
         goo
      WHERE files.reply_id = goo.id
      GROUP BY files.reply_id;
)

Man atrodo tu čia sumaišei vidinės užklausos (sub-užklausos) ir išorinės užklausų dalis.
Beto jokie kabliataškiai nededami.

Meta tokią klaidą:

1241 - Operand should contain 1 column(s) mysql

UPDATE atsss
SET attachments = (
      SELECT files.reply_id,
          GROUP_CONCAT( CAST( CONCAT_WS( '#', att_id, real_name ) AS CHAR ) SEPARATOR ',' )
      FROM files
      WHERE files.reply_id = goo.id
      GROUP BY files.reply_id )

365

(26 replies, posted in SQL užklausos ir duomenų struktūros)

šitas visai neina updatint kas negerai jame?

update atsss set attachments = (SELECT files.reply_id,GROUP_CONCAT( CAST (CONCAT_WS( att_id , '#' , real_name , ',' )AS CHAR) ) FROM files,goo WHERE files.reply_id=goo.id GROUP BY files.reply_id;)

366

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:

O tai kur klaida ar klaidos pranešimas, viskas ok gi.

Tai kaip man tuos blob ir rašys vietoj normalių duomenų ar kaip?

367

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:
skuelas wrote:

bet meta klaidą
GROUP_CONCAT(CONCAT_WS(files_id,'#',title) separator ',')

Kokią klaidą?

reply_id     GROUP_CONCAT( CONCAT_WS( att_id , '#' , real_name , ',' ) )
76     [BLOB - 11 B]
83     [BLOB - 22 B]
85     [BLOB - 22 B]

368

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:

Taigi realiai tau vietoje title reikia panaudoti savo CONCAT_WS() funkciją, o pavyzdžio, kad neradai, tai jau meluoji (-;

nu rimtai neradau...
bet meta klaidą
GROUP_CONCAT(CONCAT_WS(files_id,'#',title) separator ',')

369

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:
skuelas wrote:

šį tą atkasiau pabandžiau kažkas išėjo viskas būtų gerai jei būtų galutinis variantas tinkamas man reikia kad būtų files.id#files.title, o yra tik title,
kaip įkišti dar files.id kad įrašinėtų kartu ir dar tarp jų # įrašinėtų?

SELECT files.reply_id,GROUP_CONCAT(title separator ',') FROM files,goo WHERE files.reply_id=goo.id GROUP BY files.reply_id;

Na tai liko papildomai priklijuoti kitą stulpelį ir SEPARATOR'ių parinkti pagal norus...

O kaip tai padaryti nes neradau niekur pavyzdžio?

370

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:
skuelas wrote:
minde wrote:

Dažniausiai taip, bet priklauso nuo situacijos. Ir funkcija aišku ne ta, kurią tu dabar naudoji. Yra speciali agrgatine CONCAT_... funkcija.

files
-------------------------
id    |    title        |  reply_id
------------------------
1          a               4
2          b              4
3          c                4
4          d                5
5          e                5
6            f              6

man reikia surasti ir surinkti į attachments į kiekvieną lauką visus kur reply_id sutampa su id
          goo
---------------------
attachments
---------------------
1#a,2#b,3#c,
.........................
4#d,5#e,
.........................
6#f,


į kiekvieną eilutę atitinkamai surašyti duomenis

Patikėk manim, man tą užklausą parašyt yra 5 sekundžių darbas. Bet taip pat suprask, kad man tai visiškai neįdomu daryti ir ne dėlto šitas forumas egzistuoja.

šį tą atkasiau pabandžiau kažkas išėjo viskas būtų gerai jei būtų galutinis variantas tinkamas man reikia kad būtų files.id#files.title, o yra tik title,
kaip įkišti dar files.id kad įrašinėtų kartu ir dar tarp jų # įrašinėtų?

SELECT files.reply_id,GROUP_CONCAT(title separator ',') FROM files,goo WHERE files.reply_id=goo.id GROUP BY files.reply_id;

371

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:
skuelas wrote:

Tai kaip suprantu man naudoti reikia group by?

Dažniausiai taip, bet priklauso nuo situacijos. Ir funkcija aišku ne ta, kurią tu dabar naudoji. Yra speciali agrgatine CONCAT_... funkcija.

files
-------------------------
id    |    title        |  reply_id
------------------------
1          a               4
2          b              4
3          c                4
4          d                5
5          e                5
6            f              6

man reikia surasti ir surinkti į attachments į kiekvieną lauką visus kur reply_id sutampa su id
          goo
---------------------
attachments
---------------------
1#a,2#b,3#c,
.........................
4#d,5#e,
.........................
6#f,


į kiekvieną eilutę atitinkamai surašyti duomenis

372

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:

Na esmė, ta kad tu naudoji funkcija, kuri nėra agregatinė, o lygtais nori suklijuoti eilutėse esančius duomenis (bet nesu tuo tikras). Yra kiti metodai ir funkcijos tiem reikalam. Tau pravers raktažodis: mysql aggregate functions

Tai kaip suprantu man naudoti reikia group by?

373

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:
skuelas wrote:

Skirtukas :) Tai ką pasiūlytum man alternatyvą?

Koks "skirtukas"? Kaip tu naudoji funkciją, kai nežinai ką ji daro? Paskaitk, sužinosi, kitą kartą nereikės spėlioti.

Taip pat, paskaitęs sužinosi kaip ją naudoti ir galbūt kodėl tu nepasieki norimo rezultato.

Tai kad nieko doro nerašo ten taip pat google nieko gero nėra, labai neaiškus tas concat_ws... Prašau padėti, paaiškinti nes čia man nesuprantama kas kur blogai

374

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:
skuelas wrote:
minde wrote:

Gali trumpai parašyti, ką, tavo nuomone, daro CONCAT_WS() funkcija?

Nu kaip man pasirodė tai jinai leidžia pasirinkti kokia forma info nori įrašyti į lauką. :)

Neteisingas atsakymas. Skaityk dokumentacijoje, ką jinai tiksliai daro (-; Su spėliojimu toli nenueisi programavime..

Skirtukas :) Tai ką pasiūlytum man alternatyvą?

375

(26 replies, posted in SQL užklausos ir duomenų struktūros)

minde wrote:

Gali trumpai parašyti, ką, tavo nuomone, daro CONCAT_WS() funkcija?

Nu kaip man pasirodė tai jinai leidžia pasirinkti kokia forma info nori įrašyti į lauką. :)

376

(26 replies, posted in SQL užklausos ir duomenų struktūros)

update goo,files set attachments = concat_ws('',files.id,'#', files.title,',') where files.reply_id=goo.id

Kodėl ši užklausa nesuveda visų duomenų t.y. paima tik pirmą files.reply_id o sekančios eilutės nepaima iš files lentelės

turiu

files
-------------------------
id    |    title        |  reply_id
------------------------
1          a               4
2          b              4
3          c                4

jis paima tik pirmą eilutę o ne visas atitikmenis id ir gaunasi kad įrašas nepilnas yra pas goo.set attachments
ir attachments turėtų būti taip

1#a,2#b,3#c,

o yra blogai ir yra taip dabar ir trūksta...

1#a,

minde wrote:

žodžiu mano patarimas:

1) pasirašyk SELECT tipo užklausą, kuri grąžintu visu trijų susijusių lentelių duomenis;
2) pabandyk palikti reik tau aktualius stulpelius ir atfiltruok reikiamus rezultatus;

Ir parodyk čia tą užklausą.

Sekantis žingsnis bus ją lengvai modifikuoti ir perdaryti į UPDATE tipo užklausą.

Nu va kažkas gavosi atrodo gerai su tuo selectu gaunu svarbiausią reikšmę atsakymai_pagr.zaidimo_kv kurį reikia update'inti į zaidimu_failai.zaidimo_kv

select atsakymai_pagr.zaidimo_kv from zaidimu_ats,atsakymai_pagr,zaidimu_failai
where zaidimu_failai.atsakymo_id = zaidimu_ats.id and zaidimu_ats.atsp_id = atsakymai_pagr.id

Papildau:
EINA SAU prašviesėjo galva ir pamačiau kaip tą update įkišti...  ir viskas gavosi. Ale tu minde tikras genijus taip sakant netiesiogei įlendi man į galvą ir pravalai visą brudą mano galvoje kad suvokčiau tikrąją tiesą :D

update zaidimu_failai set zaidimo_kv =( select atsakymai_pagr.zaidimo_kv from zaidimu_ats,atsakymai_pagr
where zaidimu_failai.atsakymo_id = zaidimu_ats.id and zaidimu_ats.atsp_id = atsakymai_pagr.id)
minde wrote:
skuelas wrote:

(select atsp_id from zaidimu_ats limit 1)

Logika logika logika man tai nesuprantama :)
WHERE naudoju, o kaip be subužklausų apseiti neįsivaizduoju, kitaip nesigauna.

Parodyk, kur toje sub-užklausoje yra duomenys atrenkami pagal ką nors (WHERE).

tai selectą įkišau tik tam kad nesikeiktų mysql nes jei rašau
zaidimu_failai.atsakymo_id = zaidimu_ats.id
tai meta klaidas ir nenori visai nieko daryti.

minde wrote:

UPDATE dokumentacijoje (nuorodą daviau ir prašiau paskaityt), yra toks pavyzdys:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

čia yra atnaujinama viena lentelė pagal kitos lentelės duomenis, kai lentelių įrašai yra susiję. Tau realiai reikia tik perrašyti pagal savo lenteles.

:) Patikėk šitą variantą bandęs n kartų ir nesigauna nieko gero. Dokumentaciją aš pasižiūriu bet ten man ne viskas suprantama, o kas suprantama nesigauna.

minde wrote:
skuelas wrote:

UPDATE zaidimu_failai, atsakymai_pagr
   SET  zaidimu_failai.zaidimo_kv = atsakymai_pagr.zaidimo_kv
WHERE atsakymai_pagr.id= (select atsp_id from zaidimu_ats limit 1)
   AND zaidimu_failai.atsakymo_id = (select id from zaidimu_ats limit 1)

Manau pirma tavo klaida yra ta, kad tu naudoji sub-užklausas, vietoje lentelių sujungimo. Jos dar gal ir tiktų, bet jų logika pas tave tokia, kad jos tiesiog paima pirmą pasitaikanti ID iš lentelės. Kitaip sakant nėra atrenkami susiję duomenys. Jeigu jau kažką atrinkinėji - tai naudok WHERE.

Logika logika logika man tai nesuprantama :)
WHERE naudoju, o kaip be subužklausų apseiti neįsivaizduoju, kitaip nesigauna.