Mikähän oli viisas keino hakea tietoa taulusta, jossa on suuri määrä kenttiä, mutta ihan jokaista kenttää ei kuitenkaan haluta palauttaa taulusta?
Esim.
Taulu1: kenttä1, kenttä2, kenttä3, ... kenttä50, kenttä51, ... // suuri määrä kenttiä...
Elikkä, jos tuosta Taulu1:stä haluttaisiin palauttaa vaikka kaikki muu, paitsi ykköskenttä, niin miten se onnistuisi?
"SELECT * FROM Taulu1" tietysti palauttaisi kaikki kentät, mutta en halua kaikkia. Voiko tuohon lauseeseen jotenkin vaikka lisätä kentät, jotka haluaa sulkea ulos hausta? Kait sen jotenkin pitäisi onnistua, sillä toinen keino olisi kirjoittaa joka ainoa haluttu kenttä manuaalisesti tuohon lauseeseen, mikä tunnostaa melko epäkäytännölliseltä.
Ei taida olla muuta keinoa kuin luetella kentät yksitellen. Harvoin kuitenkaan taulussa on niin paljon kenttiä, että tästä seuraisi todellisia hankaluuksia. Jos pyytäisi kaikki paitsi tietyt kentät, tulos myös muuttuisi, jos tauluun tulisi uusia kenttiä.
Onko muuten taulussasi todella 50 eri kenttää? Tämä viittaa vähän siihen, että taulu on suunniteltu kummallisesti.
Heh, ei kyllä ihan 50 ole, mutta sen verran kuitenkin että tuollaista kenttien poissulkemisominaisuutta kaipaisin jotta lauseista tulisi nätimpiä.
Mutta mitenkä taulun muka voisi suunnitella paremmin, jos on tarvetta tallentaa käyttäjiltä suuria määriä eri tietoja? Lähinnä kaikenmaailman henkilötietoja keräilen.
Olen kyllä samaa mieltä, että SQL-kyselyistä tulee toisinaan todella kömpelön näköisiä (eikä vika edes ole aina niiden laatijassa).
Yksi vaihtoehto on siirtää tietojen otsikot kentistä riveille seuraavaan tapaan:
kayttaja tieto arvo ------------------------------------ 0001 nimi Mikko K. 0001 osoite Kylätie 10 0002 nimi Sirpa S. 0002 puhelin 1234567 0002 svuosi 1980
Tämä tarkoittaa, että jokaisen käyttäjän jokainen tieto saa oman rivin. Nyt eri käyttäjät voivat ilmoittaa eri tietoja, ja uusia tietoja voi tulla ilman, että tauluun tai ohjelmaan täytyy tehdä muutoksia.
Myös näiden toteutusten yhdistelmä on mahdollinen, eli jotkin pakolliset tiedot ovat toisessa taulussa kenttinä (niin kuin nykyisessä taulussasi) ja toiseen tauluun on koottu yllä olevalla tavalla sekalaisia tietoja, joita tulee ja menee.
Joo, tuo voisi olla tietty yksi ratkaisu. Voi kyllä olla että kirjoittelen toistaiseksi vain nuo kaikki kentät tuonne.
Jos tietokannan suorituskyky ei ole ongelma tai käyttää SQL_CACHE lausetta kyselyissä, niin kerää taulun kentät mysql_list_fields (muistaakseni tuo funktio palauttaa kenttien nimet) funktiolla ja parsi siitä sitten pois ne kentät joita et halua. Funktion pitäisi palauttaa kuitenkin järjestyksessä kaikki kentät siinä muodossa missä ne ovat itse kannassakin. Eli jos haluaa, että ensimmäinen kenttä ei ole kyselyssä, niin siitä vaan parsii kyselyn dynaamisesti niin, että ei ota taulukon ensimmäistä arvoa kyselyyn.
Vaikeasti selitetty, mutta dynaaminen kyselyjen luonti on avainsana ja siihen pitää käyttää noita funktioita joilla saa tietokannan rakenteen esiin. Siitä vaan sitten parsii oikeanmuotoisen kyselyn ja poistaa ne kentät joita EI haluta ottaa mukaan kyselyyn.
Tosin mitä järkeä on suotta alkaa kuormittamaan palvelinta? SQL_CACHE on todella pätevä ja tehokas kun suoritetaan paljon kyselyita ja palvelimella on PALJON muistia, mutta muuten kannattaa koodata vaan kyselyt hyvin manuaalisesti.
-W-
Aihe on jo aika vanha, joten et voi enää vastata siihen.