Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL: rivien numerointi ORDER BY:llä

Sivun loppuun

oukki [24.01.2013 09:05:17]

#

Seuraava pitäisi saada tehtyä. Valitaan tietokannasta tietyt rivit ja järjestetään ne. Rivien kenttä nimeltä sijoitus pitäisi sitten saada juoksevasti numeroitua siihen järjestykseen, jonka kysely antaa.

Silmukkahan siihen tarvitaan, mutta mikä. Vähän apua kiitos.

Vaikka tämä kuulostaa aika tyhmältä, tämä on tosiaan pakko tehdä näin, sillä järjestysnumeroa tarvitaan toisessa vaiheessa, jossa sitä ei voi luoda.

Grez [24.01.2013 09:47:00]

#

Itse käyttäisin foria. Snadisti riippuu siitäkin mitä kieltä käytetään.

oukki [24.01.2013 11:06:31]

#

Jaa juu, PHP on siis käytössä. Foria minä jo kokeilin, mutta siitä ei tullut oikein mitään.

dartvaneri [24.01.2013 11:28:19]

#

Heitä se for-silmukalla tehty koodi tänne, niin katotaan.

Metabolix [24.01.2013 12:47:22]

#

Tarvitaanko järjestysnumeroa vain PHP:n puolella, vai pitääkö numerointi tallentaa tietokantaan?

Joka tapauksessa voit käyttää seuraavanlaista silmukkaa:

$rivit = sql_hae("SELECT * FROM taulu ORDER BY ...");
$sijoitus = 0;
foreach ($rivit as $i => $rivi) {
	$sijoitus += 1;
	$rivit[$i]["sijoitus"] = $sijoitus;
	sql_aja("UPDATE taulu SET sijoitus = {$sijoitus} WHERE id = {$rivi["id"]}");
}

Jos rivejä on hyvin paljon, niiden kaikkien muuttaminen erillisellä UPDATE-kyselyllä voi olla hidasta. Silloin päivityksen voi tehdä suoraan tietokantaan MySQL:n muuttujien avulla jotenkin suunnilleen näin:

SET @sijoitus = 0
UPDATE taulu SET sijoitus = (@sijoitus := (@sijoitus + 1)) ORDER BY ...

oukki [28.01.2013 19:57:33]

#

Nyt näyttää tältä. Tulos on, että parhaan sijoitus on 6 ja kaikkien muiden 2, myös niillä, joilla sarja ei ole m.

$kysely = $yhteys->prepare("SELECT * FROM taulu WHERE sarja = 'm' ORDER BY 'ky', 'uy', 'parempi' DESC");
$kysely->execute(array());
$rivit = $kysely->fetch();
$sija = 0;
foreach ($rivit as $i => $rivi) {
    $sija += 1;
    $rivit[$i]["sija"] = $sija;
	$nimi = $rivi["nimi"];
	$kysely = $yhteys->prepare("UPDATE taulu SET sija = '$sija' WHERE nimi = '$nimi'");
	$kysely->execute(array());
}

The Alchemist [28.01.2013 21:06:05]

#

Ihmeellistä purkkaa tuo koodi.

$result = $pdo->query('SELECT a, b, c FROM table WHERE foo="bar" ORDER BY first, second DESC');
$smt = $pdo->prepare('UPDATE table SET pos=? WHERE name=?');

foreach ($result as $i => &$row) {
    $smt->execute([$i, $row['name']]);
}

Ainakin tuo sun alkuperäinen kyselysi on väärin, koska sorttaat kiinteiden merkkijonojen mukaan -> järjestys ei muutu. Muuta selkeästi viallista tuossa snippetissä ei ole, joten joko kirjoitit tuon koodin tänne väärin tai sitten jätit sen viallisen osan kokonaan esittämättä. Mene ja tiedä.

Metabolix [28.01.2013 23:48:38]

#

The Alchemist kirjoitti:

Muuta selkeästi viallista tuossa snippetissä ei ole,

Onhan siinä sellainen virhe, että ennen silmukkaa haetaan vain yksi rivi (fetch) vaikka pitäisi hakea kaikki (fetchAll). Koko silmukassa ei ole silloin järkeä, ja jos kysyjällä olisivat varoitukset esillä, niitä tulisi.

Lisäksi on vaarallista laittaa muuttujia suoraan kyselyyn, vaan pitää antaa ne execute-metodille, kuten The Alchemist näyttää. Hänen koodiinsa pitäisi varmaan lisätä sijoitukseen +1, ja &-merkki foreach-silmukassa on turha.

The Alchemist [29.01.2013 10:11:10]

#

No hemmetti. Mietin itsekin tuota fetch()-kutsua mutta tulin apia tarkistamatta siihen tulokseen, että se on oikein ja että fetchRow() olisi hakenut yhden rivin.

Foreach-silmukkaan laitoin &-merkin $row-muuttujan eteen siksi, että alkuperäisessä koodissa oli vähän vaikeasti tehty taulukkoon sijoittaminen ja viitteen käyttö olisi selkeyttänyt sitä. Heti seuraavaksi totesinkin koko sijoittelun turhaksi, joten jätin lopun koodin kirjoittamatta ja unohdin &-merkin sinne.

Ja vaikka itse asiassa tuolloin tuo viitteen käyttö vaikutti hyvältä idealta, niin nyt taas muistan, miksi päätin joskus aikoinaan lopettaa sen käytön kokonaan (foreach-silmukan lausekkeessa): koska php:n scopessa viite säilyy foreachin ulkopuolellekin ja siten sillä on helppo aiheuttaa mahdottomalta vaikuttavia bugeja.

oukki [29.01.2013 10:38:54]

#

FetchAll kun laittoi, niin johan alkoi toimimaan. Tiedän, ettei koodini ole mallikelpoista, mutta sovellus ei tule nettiin vaan tulospalveluksi lähiverkkoon, jossa sitä käyttää pari henkilöä. Näinollen olen ottanut tärkeämmäksi saada koodin toimimaan. Tietysti se tosin voi opettaa pahoille tavoille.


Sivun alkuun

Vastaus

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

Tietoa sivustosta