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