Tarkoitukseni on hakea tietokannasta artikkelit, jotka sisältävät tietyt kategoriat. Lopputuloksen tulisi olla lajiteltuna julkaisuajankohdan mukaan.
Tällä hetkellä toteutukseni toimii vain osittain. Saan kyllä haettu haluamani artikkelit, mutta lajittelu ontuu.
$yhteys = yhdista_tietokantaan(); $sql = "select id, kategoria, otsikko, artikkeli, julkaistu from artikkelit where kategoria = '$by_kategoria' order by julkaistu DESC"; $result = mysql_query($sql, $yhteys); while($row = mysql_fetch_assoc($result){ echo $row["otsikko"]; echo $row["artikkeli"]; }
Yllä oleva ratkaisu järjestelee artikkelit $by_kategoria:sta löytyvän tiedon mukaan.
echo $by_kategoria;
Yllä oleva tulostuu seuraavanlaisesti: harmaamustavalkoinen
Olisin kiitollinen, jos joku osaisi heittää jotain vinkkiä.
...artikkelit where kategoria = '$by_kategoria' order by julkaistu DESC
OskariB kirjoitti:
Yllä oleva ratkaisu järjestelee artikkelit $by_kategoria:sta löytyvän tiedon mukaan.
Hmm.. Onko sulla termit nyt vähän hukassa vai miksi en kässännyt? Minusta tuo SQL-lause hakee artikkelit $by_kategoria:sta löytyvän tiedon mukaan, ei järjestele. Tuloksien järjestely pitää laittaa tuonne ORDER BY -kohtaan.
Voi olla termistökin hukassa. $by_kategoria:n voi selkeyden vuoksi vaihtaa joksikin ihan muuksi
$sql = "select id, kategoria, otsikko, artikkeli, julkaistu from artikkelit where kategoria = '$by_kategoria' order by julkaistu DESC";
Jostain syystä käyttämäni 'order by julkaistu DESC' ei toimi, vaan lopputulos tulostuu sen mukaan, missä järjestyksessä kategoriat ovat tuolla $by_kategoria:ssa. Toistan nyt itseäni, $by_kategoriahan tulostui seuraavanlaisesti: harmaamustavalkoinen
Lopputulos tosiaan tulostuu noiden kategorien mukaan, eikä haluamani julkaisuajankohdan mukaan.
Otsikko 2 Julkaistu 2007-01-15 Kategoria harmaa Otsikko 1 Julkaistu 2008-01-01 Kategoria musta Otsikko 3 Julkaistu 2006-12-05 Kategoria valkoinen
En tiedä vaikuttaako se mitään asiaan mutta ainakin itse pitäisin siitä että SQL lauseessa käytettäisiin hipsuja `` ja isoja kirjaimia:
SELECT `id`, `kategoria`, `otsikko`, `artikkeli`, `julkaistu` FROM `artikkelit` WHERE `kategoria` = '$by_kategoria' ORDER BY `julkaistu` DESC
Ei kuitenkaan kannata sekoittaa `` hipsuja '' hipsuihin.
temu92 kirjoitti:
En tiedä vaikuttaako se mitään asiaan mutta ainakin itse pitäisin siitä että SQL lauseessa käytettäisiin hipsuja `` ja isoja kirjaimia:
Eipä tuo tähän asiaan mitenkään vaikuta, vaikka varmasti selkeyttäisi SQL-lauseitani.
Nyt olen vielä enemmän hämilläni :D Ihan kun tuosta em. koodistasi puuttuisi jotain oleellista, jos tuollaisella kyselyllä saa tuollaisen tuloksen. Ja jos $by_kategoria
sisältää tekstin "harmaamustavalkoinen", niin miten se voi hakea tuolta kannasta edes mitään? Sulla kannassa ilmeisesti kuitenkin kategoria on joku noista edellämainituista? Siis harmaa, musta tai valkoinen. Laitappa se kantarakenne muutaman esimerkkirivin kera tähän, niin eiköhän me saada sulle oikea SQL-lause tohon! :)
Jäi ehkä jotain oleellista kertomatta, $by_kategoriahan sisältää toisesta taulusta haettu tietoa.
$by_kategoria = $rivi["kategoria_id"]
Artikkelit-taulun rakenne on seuraavanlainen
id kategoria otsikko artikkeli julkaistu ---------------------------------------------------------- 1 musta Otsikko1 Lorem ipsum... 2007-01-15 2 harmaa Otsikko2 Ipsum lorem... 2007-01-15 3 valkoinen Otsikko3 Lorem lorem... 2006-12-05
Ja tuo kysely on sitten ilmeisesti loopissa. No silloin et pysty sitä järjestämään ajan mukaan. Sun pitäisi hakea ne kaikki yhdellä kyselyllä. Eli simppeli LEFT JOIN siitä taulusta, joka sisältää tuon kategoria_id
-tiedon, ehkä jotakuinkin näin:
SELECT a.id, a.kategoria, a.otsikko, a.artikkeli, a.julkaistu FROM kategoriat AS k LEFT JOIN artikkelit AS a ON (k.kategoria_id = a.kategoria) ORDER BY a.julkaistu DESC
Mä lähen nyt vaihtaan autoon öljyjä ja sit illanviettoon, toivottavasti pääset tosta eteenpäin :)
Ei ihan suoraan toiminut, niin muutin hieman. Ei tosin toimi vieläkään täydellisesti.
$sql = "SELECT artikkelit.id, artikkelit.kategoria, artikkelit.otsikko, artikkelit.artikkeli, artikkelit.julkaistu FROM kategoria LEFT JOIN artikkelit ON artikkelit.id = kategoria.id WHERE kategoria.kategoria_id = 'musta' ORDER BY artikkelit.julkaistu DESC";
Kategoria-taulun nykyinen rakenne, artikkelit taulu samanlainen kuin pari viestiä ylöspäin.
id kategoria_id ------------------ 1 musta 2 harmaa 3 valkoinen
Eli ongelma on tällä hetkellä seuraavanlainen. Jos kaksi artikkelia täyttää haluamani ehdot, tulostuu kumpainenkin artikkeli kahteen kertaan, kuten alla olevassa esimerkissä. Mikäli kolme artikkeli täyttää ehdot, niin nämä kaikki kolme artikkeli tulostuvat kolmeen kertaan.
Otsikko 1
Julkaistu 2008-01-01
Kategoria musta
Otsikko 4
Julkaistu 2007-01-01
Kategoria musta
Otsikko 1
Julkaistu 2008-01-01
Kategoria musta
Otsikko 4
Julkaistu 2007-01-01
Kategoria musta
OskariB kirjoitti:
Eli ongelma on tällä hetkellä seuraavanlainen. Jos kaksi artikkelia täyttää haluamani ehdot, tulostuu kumpainenkin artikkeli kahteen kertaan, kuten alla olevassa esimerkissä. Mikäli kolme artikkeli täyttää ehdot, niin nämä kaikki kolme artikkeli tulostuvat kolmeen kertaan.
Kuulostaa siltä, että sulla on edelleen siellä kaksi sisäkkäistä silmukkaa...
Pistä kaikki olennainen koodi tänne, niin meidän auttajien ei tarvitse arvailla.
LEFT JOIN artikkelit ON artikkelit.id = kategoria.id
Nopeasti katsottuna joinissasi on jotain hämminkiä.
edit
Tietorakenteesi on hieman nurinkurinen. Jos et muuta sitä, sinun on turha käyttää kategoria taulua kun kaikki tarvitsemasi tieto (kategoria_id) on myös artikkeli taulussa.
Järkevä rakennehan olisi tällainen:
kategoria: id | nimi ---+----------- 1 | musta 2 | harmaa 3 | valkoinen
artikkeli: id | kategoria_id | otsikko jne. ---+--------------+------------- 1 | 2 | Ots-1 jne. 2 | 2 | Ots-2 jne. 3 | 1 | Ots-3 jne. 4 | 3 | Ots-4 jne. 5 | 1 | Ots-5 jne.
Tähän tauluun taas sopii tuo ajv:n tarjoama JOIN:
SELECT a.id AS id, k.id AS kategoria_id, k.nimi AS kategoria, a.otsikko AS otsikko FROM artikkeli a LEFT JOIN kategoria k ON a.kategoria_id = k.id
Aihe on jo aika vanha, joten et voi enää vastata siihen.