Muutama kysymys

kyselystä

On kolme taulua:

Pizzat (id, nimi)
Ainekset (id, nimi)
Pizzansisalto (id, id_pizza, id_aines)

Data vaikka:

Pizzat:
1, Salamipitsa
2, Jauhelihapitsa

Ainekset:
1, Pohja
2, Juusto
3, Jauheliha
4, Salamia
5, Tomaatti

Sisalto:
1, 1, 1
2, 1, 2
3, 1, 4
4, 2, 1
5, 2, 2
6, 2, 3
7, 2, 5


Kysymys1:
Millä kyselyllä saa selville missä pizzoissa on esim. juustoa? Juuston id ei ole tiedossa etukäteen.

Kysymys2
Pitäisi lisätä uusi pizza: Vegaanipizza, jonka ainekset olisivat: pohja, juusto, tomaatti ja sienet. Miten tämä kannattaisi toteuttaa? Pohja, juusto ja tomaatti ovat jo olemassa ainekset taulussa ja sienet on uusi raaka-aine, mutta emmehän sitä tiedä.

Kysymys3
Salaamispitsan uusi koostumus on pohja, salami ja sienet. Yksi aines havisi ja toinen tuli tilalle, mutta emme tiedä mikä, miten tämä kannattaisi toteuttaa?

4

381

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • alkup.

      Niin ja käytössä on MySQL tietokanta, ja ohjelma toteutetaan PHP kielellä, jos sillä on väliä.

    • tohlo

      Oletkohan mahdollisesti opiskellut php-kieltä (tai yleensäkin ohjelmointia) ja tietokantojen käyttöä (sql)? Nimittäin kysymyksesi ovat aika tavalla perusasioita, joten vähintäänkin sql:n perusosaaminen olisi suotavaa.

      Valmiit ratkaisut kohdekielellä tuskin hyödyttäisivät niin paljoa kuin ideat. Silti suosittelen jotain sql-alkeisopasta tjmv.

      Kysymykseen 1: etsit juustoja sql:n like-operaattorin ja jokerimerkkien avulla (sql: select). Juuston id:tä ei tarvitsekaan tietää etukäteen. (Jokerimerkkien käyttö riippuu siitä haluatko tietää myös muunlaiset juustot, esim. homejuustot?)

      Kysymykseen 2: käyttöliittymän pitää ekana lisätä pizzat-tauluun rivi (sql: insert into) ja sitten käydä uuden pitsan ainekset yksi kerrallaan läpi, lisäten jos ei jo löydy (ota huomioon myös kirjoitusasu, esim. "juusto" vs. "juustoa"). Siispä "sienet" tulisi lisättyä tässä (ellet jollakin tekoälyllä tjmv. saa pääteltyä että esim. "sieniä"-ainekset jo löytyykin).

      Kysymykseen 3: poistat sisalto-taulusta ylimääräiset pitsan aineksiin viittaavat rivit (sql: delete) ja lisäät uudet (sql: insert into).

      • kiitos.

        >Kysymykseen 1: etsit juustoja sql:n like-operaattorin ja jokerimerkkien avulla (sql: select)

        Niin, mutta saako (jos saa niin miten) pizzanimen selville yhdellä kyselyllä. Tietenkin voi ensin etsiä juuston id, ja sitten katsoa missä pizzoissa on juustoa, mutta entäs yhdellä kyselyllä?

        >Kysymykseen 2: sitten käydä uuden pitsan ainekset yksi kerrallaan läpi, lisäten jos ei jo löydy

        Ei siis ole olemassa sellaista toimintoa "lisää vain jos ei ole olemassa jo" Niin minä luulinkin, mutta kysyinkin, ehkä on olemassa joku helpompi tapa.

        >Kysymykseen 3: poistat sisalto-taulusta ylimääräiset pitsan aineksiin viittaavat rivit (sql: delete) ja lisäät uudet (sql: insert into).

        Voihan ne yksitellenkin tarkistaa ja sitten poistaa, itse kyllä ajattelin että voisi poistaa kerralla kaikki pizzan ainekset, ja sitten lisätä vain uudet. Luulin, että onko joku "kehittyneempi" / "fiksumpi" tapa tähänkin.


      • tohlo
        kiitos. kirjoitti:

        >Kysymykseen 1: etsit juustoja sql:n like-operaattorin ja jokerimerkkien avulla (sql: select)

        Niin, mutta saako (jos saa niin miten) pizzanimen selville yhdellä kyselyllä. Tietenkin voi ensin etsiä juuston id, ja sitten katsoa missä pizzoissa on juustoa, mutta entäs yhdellä kyselyllä?

        >Kysymykseen 2: sitten käydä uuden pitsan ainekset yksi kerrallaan läpi, lisäten jos ei jo löydy

        Ei siis ole olemassa sellaista toimintoa "lisää vain jos ei ole olemassa jo" Niin minä luulinkin, mutta kysyinkin, ehkä on olemassa joku helpompi tapa.

        >Kysymykseen 3: poistat sisalto-taulusta ylimääräiset pitsan aineksiin viittaavat rivit (sql: delete) ja lisäät uudet (sql: insert into).

        Voihan ne yksitellenkin tarkistaa ja sitten poistaa, itse kyllä ajattelin että voisi poistaa kerralla kaikki pizzan ainekset, ja sitten lisätä vain uudet. Luulin, että onko joku "kehittyneempi" / "fiksumpi" tapa tähänkin.

        Onhan niitä keinoja.

        K1: esim. select p.nimi, a.nimi
        from pizzat as p, ainekset as a, sisalto as s
        where p.id=s.id_pizza and a.id=s.id_aines
        and lower(a.nimi) like '%juusto%'
        order by p.nimi, a.nimi;

        %juusto% hakee kaikki erilaiset juustot. Harjoitus: ota jokerimerkkejä pois jos haluat vain normaalin juuston. ;)

        Suosittelen tutustumaan sql-oppaissa joineihin ja hakuihin useammasta taulusta. :)

        K2: tuo "lisää vain jos ei jo olemassa" onnistuu käyttämällä (mahdollisesti epästandardeja tapoja), esim. kun oletetaan että id-kenttä täytetään automaattisesti autonumber-tyyppisenä kenttänä tjmv.:

        insert into ainekset (nimi)
        select distinct 'Sienet' from ainekset
        where lower(nimi) not like '%sienet%';

        Tuollainen pitää vaan tehdä dynaamisesti PHP:ssa, eli korvata aineksen nimi tuohon esimerkkiin kahdesti (lisättävällä nimellä ja taulusta etsittävällä nimellä ml. kirjainkoko, sijamuodot, ym.). Tällainen dynaaminen tarkistus ja lisäys täytyy siis suorittaa jokaiselle uuden pitsan ainekselle. (Ja vielä jää miettimättä se miten käyttöliittymässä saat pitsanluontisivulla esitettyä olemassaolevat ja erityisesti uuden aineksen luontimahdollisuus.)

        Helpointa olisi se, että yhdellä sivulla käsiteltäisiin vain aineksia, jolloin pitsanluontivaiheessa voitaisiin olettaa että kaikki ainekset jo taulusta löytyvät. Kun uusi pitsa sitten luodaan, on mahdollista vain valita olemassaolevista aineksista eikä luoda enää uusia.

        Helpoimmasta tavasta en sitten tiedä, minä kun olen aina tehnyt kaikki tällaiset asiat vaikeimman kautta. ;)

        K3: tässäkin voit luoda dynaamisesti delete-lauseen PHP:lla, jolla saat poistettua kaikki ylimääräiset ainekset yhdellä lauseella; esim. delete from sisalto where id_pizza=1 and id_aines in (2,4);

        Pelkän sql:n ja näiden taulujen avulla (ilman PHP:lla tehtyä dynaamista delete-lausetta) et saa poistettua ylimääräisiä aineksia, koska jostainhan sen sql:n avulla pitää hakea ne _mitkä_ ainekset ovat ylimääräisiä.

        Mahdollista olisi esim. sekin, että tekisit uuden pitsan uudella id:llä, annat sille saman nimen kuin aiemmin, lisäät siihen ainekset ja poistat vanhan pitsan sisältöineen (jos et tätä halua säilyttää esim. historian vuoksi, jolloin se pitää merkitä jotenkin vanhentuneeksi tjmv.).


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Eroa Orpo! Orpo eroa!

      Suomen kansa vaatii viimein ottamaan meidät huomioon, eikä vain ulkomaalaisia pääomasijoittajia. Koska täällä Suomessa
      Maailman menoa
      67
      2591
    2. Odottavan aika on pitkä, Lindtmanin hallitusta tule jo!

      Eilisen perusteella nykyinen hallitus epäonnistui kaikissa vaalilupauksissaan, joten olemme ansainneet uudet eduskuntava
      Maailman menoa
      63
      1702
    3. SDP esti Suomen luisumisen kohti 1984 Orwell -yhteiskuntaa

      Äärioikeistohallitus olisi halunnut Stasin tapaan mikrofonit jokaisen kansalaisen kotiin, mutta SDP esti tuon siirtymän
      Maailman menoa
      7
      1660
    4. Naiset ei halua kilttejä miehiä

      Näin se vaan on..jos olet ilman tatskoja, et rähjää, sinulla ei ole rikosrekisteriä, olet liian kiltti, et sano pahasti,
      Ikävä
      263
      1545
    5. Wille Rydman (ps) osoitti olevansa kommunisti

      Hän toistaa Neuvostoliiton virhettä. Haluaa pitää palveula yllä maksoi mitä maksoi, vaikkei ole maksavia asiakkaita. --
      Maailman menoa
      8
      1528
    6. Seiska: Helmi Loukasmäki paljastaa - Näin Danny ja Helmi tapasivat

      Helmi Loukasmäki, 25, ja Ilkka Danny Lipsanen, 83, ovat seurattuja julkkiksia. Mutta tiesitkö, miten he tapasivat? Lue
      Viihde ja kulttuuri
      25
      1228
    7. Ainoastaan 10 aloitusta ekasivulla yhdeltä henkilöltä

      Kovasti on vaivaa, ei oo muuta tekemistä tällä henkilöllä päivisin ja öisin... Taas märehtimistä ja samaa jankutusta.
      Joensuu
      24
      1071
    8. Kiinteistökauppoja

      Onko totta ettö haapaveden kaupunki on ostanut vanhan kesoilin kiinteistön? Kuulemma siihen muuttaa autokorjaamo vanhan
      Haapavesi
      41
      1032
    9. RAAMATULLINEN KASTE ON SAPATTI-LAUANTAI, EI SUNNUNTAI

      Aihe, josta ehkä on eniten kiistaa kristillisten seurakuntien piirissä, on kysymys oikeasta raamatullisesta pyhäpäivästä
      Kaste
      404
      1012
    10. Menettämisestä

      Ajatteletko, että olet menettänyt mahdollisuutesi häneen? Osaatko sanoa miksi niin tapahtui?
      Ikävä
      78
      974
    Aihe