[LØST] Avansert sortering

Diskusjoner som omhandler databaser og SQL postes her.

[LØST] Avansert sortering

Innlegg GauNodac » 28.02.2012 13:41

Hei,

Jeg lurer på om dere har noen triks til en mer avansert sortering i MySQL. Alt er fra en tabell og jeg ønsker å gjøre det på en query. Hovedsaklig sorteres det slik. 1799-0, 2400-1800, 9999-3000
I første omgang tenkte jeg på å bruke WHERE og lage en spørring pr gruppe og så slå dem sammen med UNION. Men det er en veldig liten lekker måte å gjøre det på. Noen forslag?

Selve spørringen er mer avansert enn det under. Det er bare en mockup av mitt eneste mulige løsning forslag akkurat nå.

Kode: Merk alt
SELECT id FROM table WHERE id >= 0 AND id <= 1799 ORDER BY id DESC
UNION ALL
SELECT id FROM table WHERE id >= 1800 AND id <= 2400 ORDER BY id DESC
UNION ALL
SELECT id FROM table WHERE id >= 3000 AND id <= 9999 ORDER BY id DESC
Sist endret av GauNodac den 02.03.2012 11:46, endret 1 gang
Konsollguiden.no - Norges beste konsollmagasin!
Brukerens avatar
GauNodac
Medlem
 
Innlegg: 213
Registrert: 22.10.2005 17:30

Re: Avansert sortering

Innlegg Nukleuz » 28.02.2012 15:01

Tre spørringer uten relasjon med/til hverandre, så hvorfor en spørring? Hva om en «sub spørring» returnerer 2000 og en annen 3000? Såkalte sub-queries kan bare returnere et resultat, og bør ha relasjon til selve «hovedspørringen».
Mvh
Joachim M. Giæver
http://development.giaever.org
Brukerens avatar
Nukleuz
Seniormedlem
 
Innlegg: 1659
Registrert: 09.12.2006 2:08
Bosted: Tromsø

Re: Avansert sortering

Innlegg GauNodac » 29.02.2012 0:40

Alt er fra samme tabell. Poenget mitt er at jeg skal ha fra grupper med sortert etter id. Og disse skal være synkende fra 1799-0, 2400-1800, 9999-3000

Hvis jeg gjør kun dette:
Kode: Merk alt
SELECT id FROM table ORDER BY id DESC


Så vil jeg få det sortert 9999 -> 0, men jeg ønsker først å få fra 1799->0, så skal det komme fra 2400 -> 0, Så til slutt fra 9999->3000. Og jeg er ute etter en lekrere måte å gjøre dette på enn mitt mockupforslag.
Konsollguiden.no - Norges beste konsollmagasin!
Brukerens avatar
GauNodac
Medlem
 
Innlegg: 213
Registrert: 22.10.2005 17:30

Re: Avansert sortering

Innlegg adeneo » 29.02.2012 6:08

Dette har jeg grunn ikke særlig greie på, men jeg prøver likevel :roll:
Hva er poenget med å bruke UNION ALL for tre spørringer fra samme table, mulig jeg har gått glipp av noe, men det kan da ikke ha noe for seg ?

Skal du ikke gjøre noe med dette etterpå, for eksempel i mysqli så blir det jo ofte noe sånt som en while loop mens $row fetch_array dings osv. og ville det ikke da vært enklere og mer effektivt å gjøre kun en spørring til databasen for så å sortere etter id i for eksempel en while loop eller hva som helst annet du skal gjøre etterpå ?

De kommer jo i rekkefølge så det vil vel være rett frem å putte de i forskjellige array'er eller whatever ettersom om en id er innenfor visse tall osv.
Mulig jeg er helt på viddene, men det var nå slik jeg ville gjort det, forutsatt at det er fra samme table, og det kun skal sorteres etter id.

Prøver med litt pseudo-kode som ikke er testet overhode, finnes sikkert bedre måter å skrive det på!
Kode: Merk alt
$query = "SELECT * FROM table ORDER BY id DESC";
$result = mysqli_query($db, $query);
$first=Array(); $second=Array(); $third=Array();

if ($result->num_rows > 0) {
    while($row = mysqli_fetch_array($result)) {
        $id = isset($row['id']) ? $row['id'] : '';
        if ($id<1800) {
             $first[] = $row;
        }else if ($id>=3000){
             $third[] = $row;
        }elseif($id>=1800 && $id<=2400){
             $second[] = $row;
        }
    }
}
adeneo
Medlem
 
Innlegg: 628
Registrert: 08.04.2011 21:09

Re: Avansert sortering

Innlegg DavidS » 29.02.2012 7:49

Er det mulig å få til en CASE ... THEN?
http://stackoverflow.com/questions/2005 ... r-by-issue

Eventuelt:
Kode: Merk alt

SELECT foo, IF(id BETWEEN 0 AND 1799, 0, IF (id BETWEEN 1800 AND 2400, 1, IF (id BETWEEN 3000 AND 9999, 3, 'id not between intervals'))) as orderSelector
FROM bar
WHERE id (BETWEEN 0 AND 2400) OR BETWEEN 3000 AND 9999
ORDER BY orderSelector ASC



Husker ikke om custom fields var tillatt i ORDERBY...
DavidS
Seniormedlem
 
Innlegg: 3667
Registrert: 17.05.2006 17:08

Re: Avansert sortering

Innlegg GauNodac » 02.03.2012 1:05

Takker for svar.

Adeno: Jeg ville løse det med ren SQL.

DavidS: Jeg klarte å få det til å fungere med metoden din.
Konsollguiden.no - Norges beste konsollmagasin!
Brukerens avatar
GauNodac
Medlem
 
Innlegg: 213
Registrert: 22.10.2005 17:30


Gå til SQL og databaser

Hvem er i forumet

Brukere som leser i dette forumet: Ingen registrerte brukere og 3 gjester