Olen jo jonkin aikaa pähkäillyt, enkä googlettamallakaan äkkiä löydä ratkaisua pulmaani:
Olen siis rakentanut järjestelmän, jossa voi kirjoittaa blogipostauksia. Kun postaus tallennetaan tietokantaan, sille täytetään id:n ja muiden tarpeellisten sarakkeiden lisäksi tagit -sarake, johon kirjoitetaan käyttäjän antamat tagit pilkuilla erotettuina.
Ongelma on se, että miten voin hakea tietokannasta tietyllä tagilla kaikki postaukset, joille tagi on listattu.
Esimerkki:
Tietokannassa oleva taulukko:
artikkeli a:n tagit = porkkana, sipuli, peruna
artikkeli b:n tagit = porkkana, kaali
artikkeli c:n tagit = omena
Kun haetaan "porkkana", tulostetaan "a" ja "b"
Tagien pitäisi olla omassa taulussaan ja jokaisen tagin omana rivinään. Jos välttämättä vaadit tehdä asiat väärin, niin sinuna tyytyisin siihen, että haetaan epämääräisellä LIKE-ehdolla:
SELECT a.* FROM posts a WHERE a.tag LIKE '%tagfoo,%';
Tuollainen siis täsmäisi paitsi haettuun tagiin, niin myös kaikkiin muihin tageihin, jotka loppuvat vastaavaan merkkijonoon. Ja lisävaatimuksena on toki se, että viimeisenkin tagin jälkeen täytyy tulla pilkku.
En voi mitenkään 100-varmasti sanoa mutta voisiko/kannattaisiko homma tehdä niin että jokainen tagi on omalla rivillään [blogiid, tagi] ?
googlettamalla: "php tag system mysql" sain nämä sivut:
http://stackoverflow.com/questions/14430259/
http://stackoverflow.com/questions/19447554/tag-system-using-php-mysql
joten kenties joku LIKE-systeemi
tai ehkäpä... http://mahmudahsan.wordpress.com/2008/08/27/
Kiitos nopeasta vastaamisesta!
Vaikuttaisi hyvältä tuo systeemi, että tehdään tageille oma taulukko, kokeilen sitä. Tuo LIKE -juttu ei käsittääkseni ole paras mahdollinen ratkaisu.
Ei tuo hakukysely ole mikään hirveän iso ongelma mutta tagien hallinta käy vaikeaksi, kun jokainen muutos tageihin vaatii koko tagirimpsun kirjoittamisen uusiksi.
Tai jos tekisit oman taulun jossa jokainen tagi omana rivinään
niin merkkijonosta:
$_POST['tagit'] = "ohjelmointi, php, mysql, foo";
saisi jokaisen talteen
$tagit = explode(",",$_POST['tagit']); //array, erotetaan pilkulla //$tagit[0] "ohjelmointi" //$tagit[1] "php"
tästä sitten jokainen arvo kantaan loopilla, jotenkin näin...
Ensin pitää tietenkin syöttää blogi, ja saada siitä blogin ID
$dbconnetion->LastInsertid(); //jotenkin näin ;P
foreach ($tagit as $tag) { $query = 'INSERT INTO blogtags (blogid, tag) VALUES (?,?)'; $this->db->query(array(x,y)); }
Näin ainkin poistaminen, lisääminen ja päivittäminen onnistuu ilman lisäkikkailua, ja hakeminen myös.
Aihe on jo aika vanha, joten et voi enää vastata siihen.