MySQL haku kahdesta taulusta

Tietokannassa on kaksi taulua, users ja testi.
Users taulussa on mm. käyttäjänimet.
Jokaiselle käyttäjänimelle on oma taulu, jossa yhtenä sarakkeena on viikonnumero.
Eli users-taulu:
käyttäjänimi salasana paikkakunta
koe xxx Lappeenranta
testi xyz Helsinki
yritys yzy Tampere

testi-taulu:
viikonnumero maa tii kes tor per
41 xx xy hj iu mm
42 ki kh yf ty hj
43 gf er iö kj vc

Kysymys: Millä kyselyllä saisin vastaukseksi
testi 41 42 43
eli users-taulusta etsitään käyttäjänimi, ja samannimisestä taulusta etsittäisiin kaikki viikonnumerot?
5985
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

Jokaiselle käyttäjälle oma taulu?

Mikset nyt vaan tekis 2 taulua, vaikkapa tuo users ja testi?

Users:
id, nimi, salasana, paikkakunta

Testi:
id, userid, viikko, ma, ti, ke, to, pe
-tuo userid sit foreign keynä osoittamaan users tauluun.

Haku vaikka jotenkin näin
SELECT viikko
FROM testi
WHERE userid=1

taikka:
SELECT viikko
FROM testi INNER JOIN users ON testi.userid=users.id
WHERE nimi='jojoomies'

huom: en ole mysql käyttäjä niin syntaksi voi hieman heitellä. Idis pitäs olla selvä kuitenkin.

Äänestä

En puutu kantasuunnitteluusi, mutta itse tekisin toisin.

User-taulu
id | käyttäjänimi | salasana | paikkakunta
1 | käyttäjä1 | salasana1| testikaupunki


Testi-taulu
id | uid | viikonnumero | päivä | tietoa
1 | 1 | 41 | 1 | kävin syömässä


testi taulussa, id jokaiselle tiedolle yksinöllinen, uid = käyttäjän id (user-taulussa) paiva = (ma = 1, ti = 2 jne....) tietoa sarakkeeseen tallennat jotain tekstiä



------------------------------------


Millä ehdolla haet user taulusta, jos käyttäjänimellä, niin eikö voi tehdä yhtä kyselyä suoraan testitauluun?

Äänestä
  • Users-taulussa on id-sarake valmiina ja saan helposti muutettua sen muihinkin tauluihin.
    Miten haku menisi siinä tapauksessa?

    Kokeilin myös yhtä taulua jossa olisi sekä yritys, viikko ja päiväsarakkeet.
    Rivit menevät siellä:
    Yritys | vko | maa | tii | jne...
    testi | 42 | xx | yy | zz
    testi | 43 | tr | uu | ll

    Millä haulla tuosta saisi vastauksen testi 42 43?

    Äänestä

  • Pee kirjoitti:

    Users-taulussa on id-sarake valmiina ja saan helposti muutettua sen muihinkin tauluihin.
    Miten haku menisi siinä tapauksessa?

    Kokeilin myös yhtä taulua jossa olisi sekä yritys, viikko ja päiväsarakkeet.
    Rivit menevät siellä:
    Yritys | vko | maa | tii | jne...
    testi | 42 | xx | yy | zz
    testi | 43 | tr | uu | ll

    Millä haulla tuosta saisi vastauksen testi 42 43?

    Tosta minun esimerkistäni halutun tiedon saisi näin


    SELECT * FROM user JOIN testi USING(uid) WHERE kayttajanimi = 'jaana'


    Tämä näyttää kaikki tiedot mitkä on lisätty jaanan nimellä.

    USING määrää mikä sarake on yhdistävä tekiä kanhden taulu välillä, tässätapauksessa uid (userid)

    JOIN liittää toisentaulun

    Muut varmaan tiedätkin?

    Aikasemmassa oli pien virhe, user-taulun id pitää olla uid nimeltään, jotta toi toimii.


    User-taulun uid ja testi-taulun id kannattaa pistää auto_increment jolloin arvo kasvaa automaattisesti aina yhdellä, sekä kannattaa määritellä sarakkeet uniikeis, tällöin kaksi ihmistä ei voi saada samaa uid tunnusta.



    *Kokeilin myös yhtä taulua jossa olisi sekä yritys, viikko ja päiväsarakkeet.*

    Ihan hyvä, mutta entäs jos samanapäivänä joku tekee kaksi asiaa tai entäs jos joku tekee viikossa vain yhden asian? tällöin tulee ongelmia sekä kannassa on turhaan tyhjiä tietoja.


    En tiedä mihkä käyttötarkoitukseen toi tulee, yks keino on jättää pois minun esimerkistä viikonnumero | päivä sarakkeet ja korvata ne datetimellä(tai timestampilla) niistäkin pystyy hakemaan päivän ja viikon perusteella.

    Äänestä

  • Pee kirjoitti:

    Users-taulussa on id-sarake valmiina ja saan helposti muutettua sen muihinkin tauluihin.
    Miten haku menisi siinä tapauksessa?

    Kokeilin myös yhtä taulua jossa olisi sekä yritys, viikko ja päiväsarakkeet.
    Rivit menevät siellä:
    Yritys | vko | maa | tii | jne...
    testi | 42 | xx | yy | zz
    testi | 43 | tr | uu | ll

    Millä haulla tuosta saisi vastauksen testi 42 43?

    Tässä on sulle nopeesti tehty esimerkki muutamalla kyselyl, laita data kantaasi niin voit testata. Älähämmästy, tota pitkää merkkijonoa, se on vain päivämäärä binääri muodossa (myslin tapa tallettaa päivä)

    CREATE TABLE `user` (
    `uid` int(11) NOT NULL auto_increment,
    `kayttaja` varchar(100) NOT NULL default '',
    UNIQUE KEY `uid` (`uid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


    INSERT INTO `user` VALUES (1, 'jaana');
    INSERT INTO `user` VALUES (2, 'jenna');







    CREATE TABLE `tiedot` (
    `id` int(11) NOT NULL auto_increment,
    `uid` int(11) NOT NULL default '0',
    `paiva` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    `tieto` text NOT NULL,
    UNIQUE KEY `id` (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


    INSERT INTO `tiedot` VALUES (1, 1, 0x323030342d31302d31372032333a33383a3136, 'Jaanan eka tieto');
    INSERT INTO `tiedot` VALUES (2, 2, 0x323030342d31302d31372032333a33383a3434, 'Jennan eka tieto');
    INSERT INTO `tiedot` VALUES (3, 2, 0x323030342d31302d31372032333a33393a3436, 'Jennan toka tieto');
    INSERT INTO `tiedot` VALUES (4, 2, 0x323030342d31302d31382032333a34303a3031, 'Jennan kolmas tieto');
    INSERT INTO `tiedot` VALUES (5, 1, 0x323030342d31302d31372032333a34343a3139, 'Jaanan toka tieto');









    Käyttäjä jennan tiedot
    SELECT * , DATE_FORMAT( paiva, 'viikko %v' ) AS viikko
    FROM user
    JOIN tiedot
    USING ( uid )
    WHERE kayttaja = 'jenna'

    uidkayttajaiduidpaivatietoviikko
    2jenna222004-10-17 23:38:44Jennan eka tietoviikko 42
    2jenna322004-10-17 23:39:46Jennan toka tietoviikko 42
    2jenna422004-10-18 23:40:01Jennan kolmas tietoviikko 43


    Kaikki tälläviikolla olevat tiedot (HUOM: kun tein viikko oli 42)
    SELECT * , DATE_FORMAT( paiva, 'viikko %v' ) AS viikko
    FROM user
    JOIN tiedot
    USING ( uid )
    WHERE YEARWEEK( paiva, 1 ) = YEARWEEK( NOW( ) , 1 )

    1jaana112004-10-17 23:38:16Jaanan eka tietoviikko 42   
    2jenna222004-10-17 23:38:44Jennan eka tietoviikko 42      
    2jenna322004-10-17 23:39:46Jennan toka tietoviikko 42
    1jaana512004-10-17 23:44:19Jaanan toka tietoviikko 42


    Tän vuoden viikko 43 tiedot
    SELECT * , DATE_FORMAT( paiva, 'viikko %v' ) AS viikko
    FROM user
    JOIN tiedot
    USING ( uid )
    WHERE YEARWEEK( paiva, 1 ) = '200443'

    2jenna422004-10-18 23:40:01Jennan kolmas tietoviikko 43




    Kaikki maanantaina olevat tiedot (1= sunnuntai jne.....)
    SELECT * , DATE_FORMAT( paiva, 'viikko %v' ) AS viikko
    FROM user
    JOIN tiedot
    USING ( uid )
    WHERE DAYOFWEEK( paiva ) = 2

    2jenna422004-10-18 23:40:01Jennan kolmas tietoviikko 43

    Äänestä

Kommentoi aloitusta


Pee kirjoitti:

Tietokannassa on kaksi taulua, users ja testi.
Users taulussa on mm. käyttäjänimet.
Jokaiselle käyttäjänimelle on oma taulu, jossa yhtenä sarakkeena on viikonnumero.
Eli users-taulu:
käyttäjänimi salasana paikkakunta
koe xxx Lappeenranta
testi xyz Helsinki
yritys yzy Tampere

testi-taulu:
viikonnumero maa tii kes tor per
41 xx xy hj iu mm
42 ki kh yf ty hj
43 gf er iö kj vc

Kysymys: Millä kyselyllä saisin vastaukseksi
testi 41 42 43
eli users-taulusta etsitään käyttäjänimi, ja samannimisestä taulusta etsittäisiin kaikki viikonnumerot?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu