Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kaikki paitsi tietyt kentät (MySQL)

Hoover [02.07.2007 16:20:13]

#

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

Antti Laaksonen [02.07.2007 16:51:07]

#

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.

Hoover [02.07.2007 17:09:16]

#

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.

Antti Laaksonen [02.07.2007 17:26:02]

#

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.

Hoover [02.07.2007 17:41:31]

#

Joo, tuo voisi olla tietty yksi ratkaisu. Voi kyllä olla että kirjoittelen toistaiseksi vain nuo kaikki kentät tuonne.

Wizard [03.07.2007 12:09:34]

#

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-

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta