Moikka,
Ongelmana tällä kertaa on hakutulosten järjestäminen.
Tarkoituksena olisi järjestää tietokannan tiedot normaalisti nousevan id:n mukaan, mutta ensimmäiseksi pitäis saada jokin tietty id.
Esimerkki id:n järjestyksestä:
3,1,2,4,5,6
1,2,3,4,5,6
5,1,2,3,4,6
Eli on yksi tietty id mikä haetaan ensimmäiseksi.
Onnistuuko tämmöinen yhdellä haulla vai pitääkö tehdä kaksi hakua jossa ensimmäisessä haetaan juurikin se tietty id joka halutaan ensimmäiseksi ja seuraavassa haussa loput mutta ei oteta huomioon sitä tiettyä id:tä?
-t0ll0
ps. hyvät hakusanat googleen kelpaa hyvin josta asia selviää
SELECT * FROM mytable ORDER BY (CASE WHEN id=? THEN -1 ELSE id END);
Kysymysmerkin kohdalle kulloinkin listan kärkeen haluttu ID. Kysely toki edellyttää, että ID:t ovat positiivisia lukuja.
Ehkä helpommin näin:
SELECT * FROM taulu ORDER BY id = ? DESC, id ASC
Siis järjestetään ensisijaisesti sen mukaan, onko id haluttu (kyllä = 1, ei = 0, eli suunta on DESC), ja toissijaisesti sitten id:n mukaan numerojärjestykseen.
CASE-viritelmällekin minusta selvempi vaihtoehto olisi IF:
SELECT * FROM taulu ORDER BY IF(id = ?, -1, id) ASC
Kiitokset nopeista vastauksista..
Jokainen edellä mainituista tuntuisi toimivan.
Käyttöön tuli Metabolixin ensimmäinen vinkki sen yksinkertaisuuden takia :)
-t0ll0
Minua viehättävät enemmän case- ja if-ratkaisut niiden "syntaktisen puhtauden" ansiosta.
Minusta taas nimenomaan tuo ORDER BY id = ? DESC, id ASC on syntakisesti puhtaampi kuin muut. Se on ainoa, jossa syntaksista käy ilmi, mitä itseasiassa ollaan tekemässä. Lisäksi se on ainoa, joka toimii muutenkin kuin tuurilla.
Ei missään noista tarvita tuuria.
"ORDER BY id DESC, id ASC" ei ole minusta lainkaan selkeä ilmaisutapa. Siinä on toistoa ja siksi näyttää sekavalta. Se näyttää sekavalta myös siksi, että sorttauksessa on mukana vertailulauseke eikä yksinkertaisesti lukuarvoa. (Joten se on oikeasti merkitykseltään eri kuin tuo minun lyhennelmäni.)
CnP-koodareille tuo on tietysti helpoin vaihtoehto, koska se toimii universaalisti kaikilla syötteillä eikä vaadi käyttäjältään sitäkään vähää ajatustyötä.
Case- ja if-variantit taas kertovat selkeästi, että tämä tietty ID halutaan pakottaa listan kärkeen.
Se oli ORDER BY id=luku DESC, id ASC - ei ORDER BY id DESC, id ASC. Ilmankos pidit sitä sekavana, kun luit sen väärin.
CASE ja IF variantit kertovat, että halutaan korvata jokin arvo toisella järjestettäessä, ei, että ko. arvo haluttaisiin listan ensimmäiseksi. Jos siinä olisi edes -1 tilalla joku MIN_VALUE tms, niin se olisi vähän "sinne päin". Siltikin mikäli pienin tuettu numero olisi myös kannassa, niin valittu arvo ei tulisi välttämättä ensimmäiseksi. Eli toimii tuurilla, jos valittu arvo sattuu olemaan pienempi kuin kannasta löytyvät. Erillisen vertailun pohjalta järjestäminen sen sijaan toimii aina, ja kertoo ekspilisiittisesti, että halutaan järjestää tietty arvo ensimmäiseksi.
Grez, vaikka sinä oletkin copy-paste-koodari, niin toivottavasti tämä ei päde yleisesti alalla. Jos antamani kysely ei suoraan toimi yhdessä tietyssä käyttötapauksessa, niin sitten sitä voi vapaasti muokata. Koodin kopiointi sokkona ja sitä ymmärtämättä ei ole tuuripeliä vaan idioottimaista toimintaa.
Enkä lukenut yhtään mitään väärin. Olisit lukenut viestini. Tosin ne lukemasikin kohdat jäivät näemmä ymmärtämättä. Olkoot.
Luin viestisi ja ymmärsin kaikki kohdat. Kerroin käyttötapauksen, jossa muokkaamallakaan koodisi ei toimi, joten miksi käyttää paskaa koodia joka toimii vain tuurilla.
Jos et ymmärrä koodauksen perusasioita sen vertaa että pystyisit päättelemään mitä oma koodisi tekee, niin kannattaisi ehkä jättää vastaamatta.
Ja mielestäni aika koominen päätelmä, että jos joku suosii toimivaa koodia, hän on copy&paste koodari ;D Toki jos määritelmäsi on, että jos käyttää valmiita moduuleita tai rakentaa itse niitä, on C&P-koodari. Jos kirjoittaa moduuleita, niin niistä kannattaa yleensä tehdä sellaisia jotka toimivat aina, eikä niin että jokaista käyttöä varten muokataan.
Et ymmärtänyt yhtään mitään viestistäni. Voit lukea sen toistamiseen ja kokeilla paremmalla ajalla uudestaan. Sinä vain yrität turhaan päteä, vaikka tiedät vallan hyvin, missä mielessä oman kyselyni kirjoitin. Aivan naurettavaa.
Minä en ainakaan tiedä, missä mielessä The Alchemist kyselynsä kirjoitti. CASE ja IF ovat tässä tilanteessa epäselvää purkkakoodia, joka kertoo vain, että joku yrittää nyt tehdä jotain aivan liian vaikeasti. CASE vain yhdellä WHEN-kohdalla pakottaa lisäksi miettimään, mitä ihmettä tässä on ajateltu, kun tavallinen IF ajaisi saman asian.
Sen sijaan kahden järjestyskriteerin käyttö on selvä ja looginen ratkaisu, jossa koodi suoraan kertoo tarkoituksensa. Sulut voisin vielä kelpuuttaa vertailun ympärillä, jos se on muuten ihan mahdoton käsittää.
Ei ole kovin uskottavaa sanoa, että vertailun esiintyminen järjestelyssä on paha asia, kun samaan hengenvetoon väittää, että ylipitkä CASE-rakenne, joka muuten myös sisältää samaisen vertailun, on hyvä ja selkeä ratkaisu.
Pahoittelut pitkästä viestistä, mutta The Alchemist ei näytä ymmärtävän ilman rautalankaa.
The Alchemist kirjoitti:
Et ymmärtänyt yhtään mitään viestistäni. Voit lukea sen toistamiseen ja kokeilla paremmalla ajalla uudestaan.
Pikemminkin nämä koskevat sinua. Jos nyt sitten kertaan esillle tuomani asiat enemmällä rautalangalla, niin ehkä ymmärrät ne paremmin.
The Alchemist kirjoitti:
Grez, vaikka sinä oletkin copy-paste-koodari
En ymmärrä millä perusteella tämän "päätelmän" teit. Toki, toimiva koodi on myös C&P-koodarille kiva juttu, mutta syy-seuraussuhteet on sinulla pahasti metsässä, jos kuvittelet että toimivan koodin puolesta liputtava on aina C&P-koodari.
The Alchemist kirjoitti:
Koodin kopiointi sokkona ja sitä ymmärtämättä ei ole tuuripeliä vaan idioottimaista toimintaa.
Ilmeisesti tämän purkauksesi lähtökohta oli väärä arvaus minun lähtökohdistani.
Itse tutkailin koodia siltä kannalta, mitä se semanttisesti kertoo. Eli jos esimerkiksi joku olisi kirjoittanut tuollaisen koodirivin johonkin järjestelmään ja toinen sitä ylläpitävä kooodari yrittäisi ehkä vuosia myöhemmin keksiä mitä sen on tarkoitus tehdä.
Koodi itsessään ei kerro mikä sen tarkoitus on, vaikka niin väititkin. Jos rivin yhteydessä olisi kommentti "tietokannan pienin arvo on 0", niin siinä vaiheessa tarkoitus kävisi "mutkan kautta" selväksi. Eli voisi päätellä että "okei, täällä on joku naiivi koodari kuvitellut että jos kannan pienin arvo on nyt 0, niin se on sitä myös aina tulevaisuudessa." No, aina on noviiseja ja niiden tekemiä bugeja saa korjata.
Kerroin myöskin että jos siinä olisi -1:n tilalla pienin mahdollinen arvo, niin tarkoitusperä olisi hieman vähemmän mysteeri. Lisäksi se myös toimisi luetettavammin kun tietokanta jatkossa elää.
Sen sijaan, jos siihen olisi kirjoitettu tuo ehtolauseen perusteella järjestävä, niin siitä pystyisi ilman mitään lisätietojakin päättelemään, että tarkoitus on järjestää tietty arvo ensimmäiseksi.
Eli kritisoin tuota koodiasi sillä perusteella, että tarkoitus ei käy siitä ilmi ja lisäksi että se saattaa mennä rikki myöhemmin. Eli vikoja oli huono luettavuus ja huono luotettavuus -> turhaa työtä ylläpidolle. Ei suinkaan se, että minua kiinnostaisi tippaakaan copy&paste -koodareiden tarpeet.
Jos nyt sitten vielä kertaan sen viestisi kohdat, jota en kuulemma ymmärtänyt ja jonka kehotit lukemaan uudestaan.
The Alchemist kirjoitti:
Ei missään noista tarvita tuuria.
Tuuria tarvitaan siis siinä, että tietokantaan ei koskaan ilmesty pienempää tai yhtä pientä ID:tä kuin se laittamasi maaginen numero -1 tai jokin muu numero mikä sen tilalle laitetaan.
The Alchemist kirjoitti:
"ORDER BY id DESC, id ASC" ei ole minusta lainkaan selkeä ilmaisutapa.
Olen samaa mieltä, että tuo ei olisi selkeä ilmaisutapa. Mutta tuollaista ilmaisutapaa ei myöskään kukaan ole ehdotettanut.
The Alchemist kirjoitti:
Se näyttää sekavalta myös siksi, että sorttauksessa on mukana vertailulauseke eikä yksinkertaisesti lukuarvoa.
Myös CASE ja IF -lausekkeilla sortattaessa on mukana vertailulauseke. Jos sinua närästää tuo totuusarvolla järjestäminen, niin toki voisi kirjoittaa:
ORDER BY IF(id=luku, 0, 1), id
Tästä kävisi ilmi tarkoitus ja se toimisi. Eli se olisi yhtä hyvä kuin suora totuusarvolla vertailu (makuasioita: tai parempi jos pitää totuusarvolla järjestämistä huonona tai huonompi jos ei tykkää ylimääräisestä koodista)
The Alchemist kirjoitti:
(Joten se on oikeasti merkitykseltään eri kuin tuo minun lyhennelmäni.)
Tämä on totta: Merkitys on haluttu, toisin kuin sinun ehdotuksessasi.
The Alchemist kirjoitti:
CnP-koodareille tuo on tietysti helpoin vaihtoehto, koska se toimii universaalisti kaikilla syötteillä eikä vaadi käyttäjältään sitäkään vähää ajatustyötä.
Totta, mutta myös kaikille muille koodareille olisi järkevää tehdä koodia, joka toimii aina. (Paitsi tietty jos elanto on kiinni bugisen koodin korjaamisesta.) Myöskään turhan ajattelutarpeen ja siten virhemahdollisuuden eliminoinen ei ole huono asia.
The Alchemist kirjoitti:
Case- ja if-variantit taas kertovat selkeästi, että tämä tietty ID halutaan pakottaa listan kärkeen.
Tästä olen eri mieltä. Aiemmin mainitut Case ja If-variantit kertovat, että tietty arvo halutaan järjestää samaan kohtaan -1:n kanssa. Mistään ei käy ilmi, että se haluttaisiin kärkeen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.