Špatne seřazovani z databaze pomoci order id DESC

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
t0x1c
Člen | 151
+
0
-

Zdravím mám problem. Mám databazi nyni s 308 řádky po překročení 255 zaznamu se mi začaly prvky přehazovat nahodně v modelu mám toto

public function allItems() {
    return $this->findAll()->order('id = 175 DESC')->order('id = 107 DESC');
}

Všecko šlo ok a zaznamy se vypisovaly podle id zestupně ale po překročeni 255 zaznamu se některe přidávají na začátek některe na konec a některe doprostřed. Je to nějaka chyba v nette nebo je chyba u mě?

romiix.org
Člen | 343
+
0
-

Nech na to pozerám ako chcem, nerozumiem čo by toto malo robiť.

Napíš sem prosím aký SQL to generuje a aký očakávaš.

mr.mac
Člen | 87
+
0
-

Co tam v tom order dělá ta hodnota id? Pokud chceš třídit dle id sestupně zapiš toto viz zde:

public function allItems() {
    return $this->findAll()->order('id DESC');
}
t0x1c
Člen | 151
+
0
-

mr.mac napsal(a):

Co tam v tom order dělá ta hodnota id? Pokud chceš třídit dle id sestupně zapiš toto viz zde:

public function allItems() {
    return $this->findAll()->order('id DESC');
}

Ano ja to chci řadit sestupně ale chci aby bylo id 175 a 107 prvni to mám ověřene a jde to toto jem zjistil na tomto foru. Když tam mam jen ‚id DESC‘ děla to to stejne akorat že 175 a 107 nejsou na prvním místě.

mr.mac
Člen | 87
+
0
-

Tak to je pro mne novinka, s MySql databází nepracuji (používám MS SQL) ani nevím, že takováto implementace v nette.database existuje. To ti asi neporadím.

David Matějka
Moderator | 6445
+
0
-

verze nette? od 2.1 by mel fungovat tento zapis:

->order('id ? DESC', 175)

v 2.0 to asi nepude/bude blbnout

t0x1c
Člen | 151
+
0
-

j mam 2.0.11 tuším. Ale v tom to neni když to tam nemam a mam jen id DESC tak to proste seřazuje nahodně něco da na začatek něco na konec :D viz zde http://csgo-trade.net/weapons/ když dáte inspect na obrazek je tam id.

Editoval t0x1c (8. 12. 2013 18:45)

David Matějka
Moderator | 6445
+
0
-

jakej dotaz ti to sestavi?

Eda
Backer | 220
+
0
-

No, však ty to řadíš podle toho, „zda se id rovná 175 sestupně“. Tzn u id = 175 bude výraz roven 1, jinak nula. Seřadíš to podle tohoto a to je výsledek se ještě seřadí obdobným způsobem pro 107. Tzn. nejdřív bude ID 175, pak ID 107, pak ostatní.

$this->findAll()->order('id = 175 DESC')->order('id = 107 DESC');

Neříkáš nic dalšího o tom, jak se má řadit ten zbytek (např. jestli má být 109 před 110 nebo naopak). Tzn databáze si to srovná, jak chce.

Řešení by mělo být takové, že to krom toho 107 a 175 srovnáš i podle ID:

$this->findAll()->order('id = 175 DESC, id = 107 DESC, id DESC');

Editoval Eda (8. 12. 2013 19:43)

t0x1c
Člen | 151
+
0
-

Eda napsal(a):

No, však ty to řadíš podle toho, „zda se id rovná 175 sestupně“. Tzn u id = 175 bude výraz roven 1, jinak nula. Seřadíš to podle tohoto a to je výsledek se ještě seřadí obdobným způsobem pro 107. Tzn. nejdřív bude ID 175, pak ID 107, pak ostatní.

$this->findAll()->order('id = 175 DESC')->order('id = 107 DESC');

Neříkáš nic dalšího o tom, jak se má řadit ten zbytek (např. jestli má být 109 před 110 nebo naopak). Tzn databáze si to srovná, jak chce.

Řešení by mělo být takové, že to krom toho 107 a 175 srovnáš i podle ID:

$this->findAll()->order('id = 175 DESC, id = 107 DESC, id DESC');

Aha dik Edo už je to ok ale divne je že do těch 255 zaznamu to šlo bylo to uplně ok tak jak jsem to měl. A když mam teď 302 záznamů tak se to tak rozházelo :D