Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP/MySQL order by-ongelma

Sivun loppuun

OskariB [17.01.2009 12:58:35]

#

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

ajv [17.01.2009 13:20:18]

#

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

OskariB [17.01.2009 13:40:13]

#

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

temu92 [17.01.2009 14:08:03]

#

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.

OskariB [17.01.2009 14:31:59]

#

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.

ajv [17.01.2009 14:46:41]

#

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! :)

OskariB [17.01.2009 15:36:59]

#

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

ajv [17.01.2009 16:09:48]

#

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 :)

OskariB [17.01.2009 17:58:00]

#

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

ajv [18.01.2009 10:42:52]

#

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.

kayttaja-2499 [18.01.2009 12:32:56]

#

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.

Metabolix [18.01.2009 14:40:11]

#

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

Sivun alkuun

Vastaus

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

Tietoa sivustosta