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

360

    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. Sannalla tänään vuorossa The Daily Show

      Eli nyt mennään jo satiirin puolelle. Tuohan on vähän kuten Lindströmin ohjelma Suomessa.
      Maailman menoa
      56
      7775
    2. Tanskassa lain vaatimana Bovaer tappanut nautoja ja sairastuttanut

      Samaa myrkkyä myös Suomen lehmiin ollut tuloillaan, miten teidän tilalla? https://www.agriland.ie/farming-news/bovaer-m
      Maailman menoa
      67
      5871
    3. Ruotsalaisuuden Päivän virallinen liputuspäivä poistettava VÄLITTÖMÄSTI!

      Suomen valtion ja suomalaisuuden kannalta ei ole minkäänlaisia perusteita liputtaa virallisesti ruotsalaisuuden päivää,
      Maailman menoa
      61
      5360
    4. Täysi ryöpytys Sanna Marinille ulkomailla.

      https://www.iltalehti.fi/ulkomaat/a/f699d84f-fa53-4dba-8718-2c395017fc55 Sanna Marinin kirja saa todella tylyn vastaanot
      Maailman menoa
      51
      5263
    5. Minja Koskelan "istumista" kertovassa uutisessa ei sanottu persuista mitään

      eli jälleen kerran äärivasemmistolainen valehtelee, hän kun väittää että juuri persut ovat lähetelleet Koskelalle vähemm
      Maailman menoa
      108
      4602
    6. Pekka Visuri: "Suomen on aika irrottautua Ukrainan sodasta"

      Slava Ukraina-mölinät eivät enää auta. Ukraina on sotansa hävinnyt. Nyt tarvitaan poliittista selvänäköisyyttä, reaalipo
      Maailman menoa
      107
      2303
    7. Maajussi-Villen morsioehdokas Maarit ei halunnut Villeä - Tämä totuus valkeni kuvauksissa!

      Ohhoh, tekikö Maarit mielestäsi oikean ratkaisun Villen suhteen? Maajussi-Ville on herättänyt voimakkaita tunteita puol
      Maajussille morsian
      4
      1155
    8. Ei välimatka meitä erottanut

      Vaan välirikko ja väärinymmärrykset. Oikeastaan henkinen välimatka on meidän välillä pieni, näin uskon. Näen koko ajan e
      Ikävä
      2
      1145
    9. Kohta taas mesikämmeneen

      Onneksi kaupunki ostaa mesikämmenen, niin päästään taas tekemään rahaa
      Ähtäri
      37
      1006
    10. Olin ihan varma että sä olet se oikea

      Tunteet kuitenkin kuoli käyttäytymisesi johdosta. Hyvin tehty jos oli tarkoituskin. Oppia ikä kaikki ja jotkut ei opi ko
      Ikävä
      43
      954
    Aihe