Autor Zpráva
MONTYCEK
Profil
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
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
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
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
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
midlan:
Ehm. Nefunguje.
midlan
Profil
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: