Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL Tietojen selauksessa ongelmia

Sivun loppuun

Hoover [30.08.2007 15:35:22]

#

Mitenkä MySQL:llä voisi tehdä sellaisen kyselyn, että se osaisi hakea nimen mukaan edellisen (pienemmän) tai seuraavan (suuremman) arvon?

Minulla on siis tämän tyyppinen taulu:

Ukkeli-taulu
int(laskuri) id
varchar nimi


Ukkeli-taulussa on siis useita ukkeleiden etunimiä. Jotenkin taulusta pitäisi voida hakea nimen mukaan jotain nimeä suurempi tai pienempi arvo, koska haluan tehdä napit, joilla voidaan selata ukkeleita (eteen ja taakse).

Tällaisella lauseella sain tehtyä haun, mutta ongelmaksi muodostui se, jos tietokannassa on useita täysin samannimisiä ukkeleita, koska lause pomppaa näiden ukkeleiden yli aina.

Edellisten ukkeleiden haku-lause:

SELECT nimi
FROM ukkeli
WHERE nimi < jokin_nimi

Pitäisikö tuohon jokin toissijainen ehto laittaa, jonka avulla voitaisiin selata samannimisiä arvoja? Esim. toissijaiseksi laittaisi vaikka id:n, vai onko jotain parempia keinoja?

Antti Laaksonen [30.08.2007 17:09:40]

#

Tuopa onkin aika hankala juttu. Mutta yksi ratkaisu on tosiaan järjestää samannimiset ukkelit id:n mukaan. Jos yhdistää uuteen merkkijonoon nimen ja id:n, selviää aika vähin muutoksin.

SELECT nimi, id
FROM ukkeli
WHERE CONCAT(nimi, id) < 'Mikko6'
ORDER BY CONCAT(nimi, id) DESC
LIMIT 1

Tässä haetaan kaikki Mikkoa ennen olevat ukkelit sekä myös muut Mikot, joiden id on alle 6. Toivottavasti ukkeleiden nimissä ei esiinny numeroita, koska silloin nimeä ja id:tä ei voi yhdistää noin huolettomasti.

Hoover [30.08.2007 17:32:21]

#

Heh, siellä voi esiintyä ihan mitä tahansa peruskirjaimia / numeroita. :)

Pitkään olen tässä tuumaillut ratkaisua, mutta en ole oikein keksinyt mitään hyvää.

Toistaiseksi laitoin selailun menemään id:n mukaan, mutta mielellään otan vastaan vielä ehdotuksia jos joku tietää miten voisi nimen mukaan selata.

Antti Laaksonen [30.08.2007 17:41:22]

#

Haun voi tehdä näinkin, jolloin nimiin ei tule rajoituksia:

SELECT nimi, id
FROM ukkeli
WHERE nimi < 'Mikko' OR (nimi = 'Mikko' AND id < 6)
ORDER BY nimi DESC, id DESC
LIMIT 1

Hoover [31.08.2007 10:56:04]

#

Kiitti, tuohan toimii ihan nätisti tuollensa.

Entäpä jos haluaisin vielä paikkakunnan toissisijaiseksi järjestykseksi ja kolmantena olisi sitten vasta id?

Antti Laaksonen [31.08.2007 11:14:02]

#

Saman kaavan mukaan:

SELECT nimi, paikka, id
FROM ukkeli
WHERE nimi < 'Mikko' OR (nimi = 'Mikko' AND paikka < 'Helsinki') OR (nimi = 'Mikko' AND paikka = 'Helsinki' AND id < 6)
ORDER BY nimi DESC, paikka DESC, id DESC
LIMIT 1

Hoover [31.08.2007 11:28:29]

#

Ahaa, no nyt älysin. ;D

Hoover [31.08.2007 13:14:41]

#

Mikähän muuten voisi olla vikana, kun minä ajan nämä hakuparametrit htmlentities() -funktion läpi, niin ä:llä, ö:llä tai å:lla alkavat hakuparametrit eivät toimi? Ne eivät palauta mitään tuloksia.

Nuo hakuparametrit kuitenkin pitäisi ajaa tuon läpi, koska niissä voi olla heittomerkkejä yms.

Lisäys
Nyt toimii, pistin addslashes() -funktion tuon htmlentitiesin tilalle.


Sivun alkuun

Vastaus

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

Tietoa sivustosta