Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP/SQL: Ongelma kahden taulun kanssa

Sivun loppuun

kamppis [02.03.2014 20:53:23]

#

Moro! Olen tässä yritänyt pähkätä, että mitenkä seuraavanlainen tilanne hoidetaan:

http://i.imgur.com/g0R6q42.jpg

Kuvassa olisi siis kaksi taulua, yhdessä on henkilöitä ja PK olisi ID. Toisessa taulussa PK olisi int_ID joka pitäisi yhdistää ekaan tauluun. Oletetaan, että käyttäjällä on edessään valikko jossa voidaan ruksia erilaisia harrastuksia. Mikäli käyttäjä vaikka ruksii tanssiminen ja hölkkääminen niin kuinka haku tehdään jotta tuloksena tulisi ne joilla käyttäjät jotka ovat valinneet 1 tai 3? Voiko yhdessä solussa olla useampia arvoja? Suunnitelmissa olisi esim. että rekisteröimisvaiheessa käyttäjä voisi valita nuo harrastukset.

Yksittäisten tulosten hakeminen onnistuu, mutta ongelmia nousee jos yhdellä ihmisellä on useampi aktiviteetti listattuna. Kuinka asia hoidetaan oikein?

-tossu- [02.03.2014 21:10:17]

#

Tee kolmas taulu, jossa on sarakkeet ID ja int_ID, ja tallenna siihen tiedot henkilöiden harrastuksista. Silloin harrastusten hakeminen onnistuu helposti JOIN:illa.

p99o [02.03.2014 21:19:12]

#

kolmas taulu, kuten jo sanottu. Koska käyttäjillä voi olla useita harrastuksia ja harrastuksilla useita harrastajia, on suhde n:n.

Kolmas taulu sisältää siis tiedon kuka harrastaa ja mitä [userid,hobbyid].
Lue vaikka tämä kohdasta viitteet ja suhteet: http://appro.mit.jyu.fi/2007/syksy/tiedonhallinta/luennot/luento5/

Lainaus:
Uusi taulu, joka yhdistää omistajan ja asunnon (Monen suhde moneen). Henkilö voi omistaa useita asuntoja ja asunnolla voi olla useita omistajia

kamppis [02.03.2014 21:29:51]

#

Kiitti. Mä yritän huomenna. Laitan viestiä jos ei onnistu

mrkebab [04.03.2014 20:40:35]

#

No. Try not. Do... or do not. There is no try.

kamppis [04.03.2014 22:10:51]

#

Äh, menin nyt sekaisin.. Mutta mikä tuossa kolmannessa taulussa olisi sitten PK? Vaikka miten yritän miettiä tilannetta niin taulut menee solmuun jos yhdellä henkilöllä on kaksi harrastusta.. Olisiko laittaa tauluista esimerkkikuvaa ja kertoamitä tapahtuu?

Onko tarkoitus siis tehdä useita rivejä yhdelle henkilölle? Eikö siinä tule ongelmia jos henkilö vaihtaa harratuksia myöhemmin? Kiitoksia.

Sami [04.03.2014 22:44:22]

#

Pääavain voi hyvin olla yhdistelmä sen taulun molemmista sarakkeista, koska tämä pari on aina uniikki (samalla henkilöllä ei voi olla samaa harrastusta kahteen kertaan).

Ensimmäisessä taulussa sinulla on siis henkilöt, esimerkiksi

HENKILO

id | nimi
-----------
 1 | Petteri
 2 | Hannu
 3 | Ville
 4 | Anna

Toisessa taulussa lista mahdollisista harrastuksista, esimerkiksi

HARRASTUS

id | harrastus
-----------
 1 | Potkupallo
 2 | Lätkä
 3 | Shoppailu
 4 | Juoksu

Ja kolmas taulu vain liittää henkilöt oikeisiin harrastuksiin, esimerkiksi

HENKILO_HARRASTUS

henkilo_id | harrastus_id
-------------------------
 1         | 1
 1         | 3
 2         | 1
 3         | 3
 3         | 4

kertoo, että Petteri harrastaa Potkupalloa ja Shoppailua, Hannu harrastaa Potkupalloa, Ville harrastaa Shoppailua ja Juoksua ja Anna ei harrasta mitään.

Jos henkilön harrastukset muuttuvat, niin lisäät ja/tai poistat tuosta kolmannesta taulusta rivejä tarpeen mukaan.

p99o [05.03.2014 10:23:40]

#

kamppis kirjoitti:

Onko tarkoitus siis tehdä useita rivejä yhdelle henkilölle? Eikö siinä tule ongelmia jos henkilö vaihtaa harratuksia myöhemmin?

Vaikka Sami tämä jo selittikin niin selitän minäkin :D ...

Oletetaan että on sosiaalisen median sivu, esim facebook - jos se yhtään helpottaa ymmärtämistä. On käyttäjiä ja sivuja joista tykätä. Käyttäjä voi tykätä montaa sivua ja sivusta voi tykätä monta ihmistä (suhde monta:monta).

Luodaan siis taulu sivutykkäykset (pagelikes). Tässä taulussa pääavain voi olla pagelikeid. yhdellä rivillä on siis pagelikeid (PK), userid (FK), pageid (FK), timestamp (aika koska tykätty).
yms...

Kun poistetaan tykkäys, poistetaan rivi jossa käyttäjä X ja sivu Y

kamppis [05.03.2014 12:50:18]

#

Nyt aukes! Kiitoksia! Jatkamme siis tästä!

p99o [05.03.2014 14:00:06]

#

Jos sinulla on harrastuksia josta käyttäjän pitää valita, niin
checkboxien arvot voi nopeasti tallentaa kantaan jotenkin näin (en ole testannut kuitenkaan, katsoin stackoverflowsta.)

<input name="harrastukset[]" type="checkbox" value="1"/>... Golf
<input name="harrastukset[]" type="checkbox" value="2"/>Tennis
<input name="harrastukset[]" type="checkbox" value="3"/>Lenkkeily
<input name="harrastukset[]" type="checkbox" value="4"/>Ohjelmointi

value on harrastuksen id, tämä voidaan generoida suoraa tieokannasta.

koodissa käydään valitut arvot läpi loopilla:

$harrastukset = $_POST['harrastukset'];
//looppi:
foreach($harrastukset as $harrastusid) {
    echo "{$harrastusid} valittub<br/>";
    //sql-lause, insert/delete
    ... $query->prepare("insert into harrastajat ... ...");
}

ps. saa korjata jos olen ihan väärässä

kamppis [05.03.2014 16:05:22]

#

Toimii täydellisesti. Tehdääs nyt jatkokysymys samontein. Pitäisi sisäistä postia lähettää käyttäjien välillä. Onko tähän jotain ns. "oikeaa" tapaa jota kaikki käyttää vai pitääkös tässä vain kylmästi kikkailla tietokantojen avulla? Kuinkas tietty käyttäjä pystyy saamaan hälytyksen uudesta postista? Ainakin postit voisi osoittaa oikeille henkilöille ID:n avulla hmm.

Jotain tälläistä olisi mielessä:
Tietokannassa on taulukko postien lukumäärälle. Kun käyttäjä kirjautuu sisälle niin katsotaan tietokanta läpi ja verrataan aiempaa tulosta. Mutta mihinkä noita tuloksia sitten tallennettaisiin niin, että ne ovat vertailukelpoisia. Vai yritänkö vaikeimman kautta?

Triton [05.03.2014 17:02:36]

#

Jos tarkoitus on tehdä joko yksityiset viestit -tyyppinen systeemi, niin teet taulun johon teen sarakkeet: id, viesti, lähettäjä_id, vastaanottaja_id, luettu. Kun uusi viesti lähetätään luettu-sarakkeen arvo on false ja kun viesti on avattu vaihdetaan sen arvoksi true. Sitten esim. pollataan ajaxia käyttäen et löytyykö kirjaantuneelle henkilölle uusia lukemattomia viestejä ja tehdään ilmoitus. Tietenkin on oikeastaan fiksua tehdä oma taulu viestiketjuja varten ja yhteen viestiin vaan tallennetaan vielä viestiketjun id.

kamppis [05.03.2014 19:55:08]

#

Juuh :). Sain tuon toimimaan raakileversiona. Viestit saan menemään perille ja luettua ja ne näkyy tietyiltä henkilöiltä. Seuraava vaihe on tuo luettu-sarakkeen tekeminen. Mielenkiintoista!

Metabolix [05.03.2014 20:03:51]

#

Itse laittaisin viestiin lähetysajan ja tekisin myös luettu-sarakkeesta aikaleiman (lukemattomassa viestissä NULL).

Triton [05.03.2014 21:12:38]

#

Joo, voi se olla parempi laittaa aikaleima, niin ainakin voidaan todentaa, koska viesti on luettu ja sitten jos halutaan tehdä sellainen facebook-tyylinen "nähty"-systeemi, niin siitä saa kivasti sen ajankin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta