Úprava řazení pouze části záznamů z MySQL

jedlicka
Člen | 70
+
0
-

Ahoj,

měl bych dotaz ohledně řazení záznamů z Table/Selection.

Načtu seznam záznamů z MySQL pomocí selectu a seřadím dle data, např.

$contracts = $this->database->table(Constants::DB_TABLE_CONTRACTS)->where(array('uid' => $uid))->order('date DESC');

A v tom resultu bych potřeboval najít záznamy, které mají nějaký flag (označeny jako urgentní urgent=1) a ty bych potřeboval předřadit před ostatní záznamy (dát je na první místo).

Jak na to?

Děkuji za každou radu.

Martin

Modul IS
Bronze Partner | 2
+
+3
-
  • Můžeš použít vícenásobné řazení: ORDER BY column1 ASC, column2 DESC;
  • Můžeš použít custom řazení: ORDER BY FIELD(urgent,1,2,0);
jedlicka
Člen | 70
+
0
-

Omlouvám se, napsal jsem to neúplně. Ten urgent není hodnota, ale odkaz do jiné DB tabulky (urgent_id), kde je samotná hodnota urgent. Potřeboval bych, aby se nejprve seřadily záznamy, které mají hodnotu urgent=1 (v tabulce Urgent) a až poté ostatní záznamy seřazené dle ‚data DESC‘.

Tabulka Records:

id uid date name urgent_id
1 10 2022–05–10 test 1 1
2 10 2022–05–11 test 2 2
3 10 2022–05–12 test 3 3
4 10 2022–05–13 test 4 4

Tabulka Urgent:

id urgent
1 0
2 1
3 1
4 0

Result (nejprve záznamy s urgent=1, poté ostatní řazené podle date DESC):

2 10 2022–05–11 test 2
3 10 2022–05–12 test 3
4 10 2022–05–13 test 4
1 10 2022–05–10 test 1
Kamil Valenta
Člen | 820
+
+2
-
->order('Urgent.urgent DESC, date DESC')

Prostě si ten sloupec JOINeš.

jedlicka
Člen | 70
+
0
-

Řazení pomocí order asi nebude nejlepší, protože hodnot urgent může být více (0–14). Já ale potřebuji, aby na prvním místě byly záznamy pouze s hodnotou urgent 1.

Pavel Kravčík
Člen | 1195
+
0
-

Mělo by stačit použít ten FIELDSET() viz výše.

jedlicka
Člen | 70
+
0
-

@PavelKravčík Popravdě nevím jak. Potřebuji seřadit záznamy nejprve podle data a pak jim předřadit záznamy, které mají urgent 1 (může to být i obráceně – nejprve zobrazit záznamy s urgent 1 a pak ty ostatní seřadit podle data).

Provedu:
$contracts = $this->database->table(Constants::DB_TABLE_CONTRACTS)->where(array('uid' => $uid))->order('date DESC');
$contracts->order("FIELD(urgent_id," . implode(',', $this->urgent) . ") DESC");

kde $this->urgent je pole ID záznamů z tabulky Urgent s urgent=1 (v tomto případě array(2,3)).

ale to mi nefunguje.

Pavel Kravčík
Člen | 1195
+
+2
-

@jedlicka: Máš to přece obráceně ne? Napiš si to nejdřív v čistým DB, ať e vyhneš chybám v kódu (vypadá trochu vachrlatě).

ORDER BY FIELD(firstname, "Tomáš") DESC, user.lastname ASC //Tomáš Z, Zbyněk A, Aleš B

jedlicka
Člen | 70
+
+1
-

@PavelKravčík Díky moc, funguje to.