Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL: Order By -ongelma

OskariB [06.03.2010 21:25:12]

#

Pitäisi saada listattua tiedot prioriteetin mukaan niin, että prioriteetti * parentin prioriteetti. Alla tämän hetkinen SQL -lausekkeeni. Ymmärrän ongelman, mutta en tiedä mitä pitäisi tehdä.

SELECT name, priority FROM taulu ORDER BY priority * (SELECT priority FROM taulu WHERE id = parent) DESC;

Käyttämäni taulun rakenne on yksinkertaistettuna seuraavanlainen:

+---------------+----+--------+----------+
| name          | id | parent | priority |
+---------------+----+--------+----------+
| etusivu       | 1  | 0      | 1.0      |
| artikkeli     | 2  | 0      | 0.5      |
| ala artikkeli | 3  | 2      | 0.7      |
| alin sivu     | 4  | 3      | 0.9      |
| testisivu     | 5  | 0      | 0.8      |
+---------------+----+--------+----------+

Yllä olevan taulun tulisi tulostua:

Etusivu 1.0
Testisivu 0.8
Artikkeli 0.5
Ala artikkeli 0.35
Alin sivun 0.315

Metabolix [06.03.2010 22:03:55]

#

Muodosta kysely tällaisessa muodossa:

SELECT
  t1.x * t2.x AS y
FROM t AS t1
JOIN t AS t2 ON t1.parent = t2.id;

OskariB [06.03.2010 22:38:08]

#

Metabolix kirjoitti:

Muodosta kysely tällaisessa muodossa:

SELECT
  t1.x * t2.x AS y
FROM t AS t1
JOIN t AS t2 ON t1.parent = t2.id;

Tämä ei kuitenkaan taida toimia kuvailemallani tavalla. Esimerkiksi "Alin sivu" -sivun prioriteetiksi muodostuisi 0.63, vaikka oikean tuloksen pitäisi olla 0.315.

Oikeanlainen kaavahan näyttäisi tältä:

Artikkeli * Ala artikkeli
(0.5 * 0.7) = 0.35
Ala artikkeli * Alin sivu
(0.35 * 0.9) = 0.315

Kun se nyt näyttää tältä

Ala artikkeli * Alin sivu
(0.7 * 0.9) = 0.63

Chiman [07.03.2010 11:22:37]

#

Itse laskisin tuon tietokannan ulkopuolella; rekursiolla, tallettaen matkalla laskettujen arvot myös, jottei tarvitse laskea samoja uudestaan.

FooBat [07.03.2010 11:47:43]

#

Itse varmaan lisäisin uuden kentän tuohon tauluun, johon laskisin oikean prioriteetin aina kun tasokohtainen prioriteetti muuttuu. Aina kun tasokohtainen prioriteetti muuttuu niin pitää sen ja sen lapsielementtien oikeat pririteetit päivittää rekursiivisesti. Olettaen, että prioriteetit ei kovin usein vaihdu niin tämä on varmaan aika tehokas ratkaisu, koska hakulausettakin voi yksinkertaistaa.

Metabolix [07.03.2010 12:36:33]

#

FooBatin ajatusta jatkan: Päivittäminen onnistuisi ehkä näppärästi triggerillä. Voisit AFTER UPDATE -triggerissä päivittää kaikki lapsirivit, jolloin triggeriä kutsuttaisiin rekursiivisesti taas niille jne. Vastaavasti voisit BEFORE INSERT -triggerillä laskea alkuarvon.

Vastaus

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

Tietoa sivustosta