Autor | Zpráva | ||
---|---|---|---|
MONTYCEK Profil |
#1 · Zasláno: 7. 1. 2016, 13:34:32
Zdravím, měl bych dotaz ohledně řazení článků z mysql.
Mám tabulku clanky kde je sloupec id, datum, nadpis, text a typ. V tom sloupci typ jsou hodnoty 1 nebo 0. a zatím to vypisuji jenom takto SELECT * FROM clanky ORDER BY id DESC Ale potřeboval bych vědět zda je možné to řadit tak že budou vždy dva záznamy s hodnotou typ 0 a jeden s hodnotou typ 1 př. članek typ 0 članek typ 0 članek typ 1 članek typ 0 članek typ 0 članek typ 1 ... Nevíte někdo jak na to? |
||
Kajman Profil |
#2 · Zasláno: 7. 1. 2016, 14:15:29
Uděláte dva dotazy, jen na 0 a jen na 1. V aplikaci (např. díky php) pak střídavě budete brát dva řádky z prvního výsledku a jeden z druhého.
|
||
MONTYCEK Profil |
#3 · Zasláno: 7. 1. 2016, 14:26:27
Kajman:
Nebyl by nějaký příklad? Ještě bych doplnil, že ten dotaz posílám v php na funkci která zajistí rozdělení výsledku na jednotlivé stránky a doplní odkazy na stránky. |
||
Kajman Profil |
#4 · Zasláno: 7. 1. 2016, 14:58:18
Pokud potřebujete jen nějaký jednoduchý dotaz, aby ho ta funkce zvládla, tak si asi budete muset udělat sloupec s předpočítaným pořadím řádků a ten aktualizovat po každém přidání řádku, smazání řádku nebo změně typu či id.
|
||
midlan Profil |
#5 · Zasláno: 8. 1. 2016, 15:47:27
Lze řešit i na úrovni databáze:
SET @rownum = 0; SELECT *, MOD(@rownum := @rownum + 1, 3) = 0 AS ideal_typ from clanky ORDER BY typ = ideal_typ DESC, typ; Funkční příklad na: sqlfiddle |
||
juriad Profil |
#6 · Zasláno: 8. 1. 2016, 15:54:00
midlan:
Ehm. Nefunguje. |
||
midlan Profil |
#7 · Zasláno: 8. 1. 2016, 16:00:36
Ano máš pravdu nefunguje, akorát jsem ten příspěvek šel editnout a upozornit na to. Každopádně si myslím, že řešení na úrovni databáze existuje.
|
||
MONTYCEK Profil |
#8 · Zasláno: 8. 1. 2016, 16:08:42
Zatím jsem to vyřešil sestavením pole data[typ_0] a data[typ_1] a ty potom podle potřeby spojím, ale zajímalo by mě zda by to šlo řešit i na úrovni té databáze.
|
||
midlan Profil |
Napadlo mě jiné jednoduché řešení problému jedním dotazem. Data seřadíš jen podle typu (
ORDER BY typ ASC ). Data si v PHP připravíš do pole a při procházení vezmeš vždy dva články zpředu pole a jeden odzadu, přibližně takhle:
<?php //počítání pole je v PHP pomalé, proto ho nebudeme počítat při každém průchodu v následujícím cyklu $rc = count($clanky); while($rc >= 3) { //každá funkce vrací jeden článek, buď je rovnou vypiš nebo ulož na později v tomto pořadí do jiného pole array_shift($clanky); array_shift($clanky); array_pop($clanky); $rc -= 3; } //zde si poraď se zbylými články EDIT: A pokud budeš chtít zachovat řazení podle ID sestupně použij: SELECT * from clanky ORDER BY typ, IF(typ = 0, id, -id) DESC; Přesto bych ti spíš doporučil zavést datum článku a přestal se spoléhat na to, že vyšší id znamená novější článek. |
||
Časová prodleva: 9 let
|
0